Member 12782228 Ответов: 0

У меня есть пользовательский элемент управления шаблоном XAML с кнопками внутри. Как элегантно изменить свойства каждой кнопки?


На работе у меня есть несколько страниц, каждая с кнопками в тех же местах и с теми же свойствами. Каждая страница также имеет незначительные отличия. Для этого мы создали шаблон userControl и поместили в него все кнопки, а затем применили этот пользовательский элемент управления ко всем страницам. Однако теперь довольно трудно получить доступ к кнопкам и изменить их из xaml каждой страницы, потому что они находятся внутри пользовательского элемента управления на странице..... Как мне элегантно получить доступ к кнопкам с каждой страницы?


Что я хочу сделать, так это позволить пользователю установить свою собственную кнопку где-нибудь в xaml и украсть любые обновленные свойства для моей кнопки.

Что я уже пробовал:


  1. В настоящее время мы привязываемся к куче свойств зависимостей. Мне не нравится этот вариант, потому что у меня много кнопок, и мне нужно управлять многими свойствами этих кнопок. В результате получаются сотни свойств зависимостей и настоящий беспорядок, через который приходится пробираться, когда нам нужно что-то изменить.
  2. Другой метод заключается в использовании стилей. В целом мне нравится этот метод, но поскольку эти кнопки находятся внутри другого элемента управления, их становится трудно изменить, и шаблон будет точно подходить только для одной кнопки в одно время.
  3. Другой способ-использовать триггеры данных, но у этого есть та же проблема-я должен полагаться на кучу нескольких свойств зависимостей
  4. Адам Кемп написал о том, чтобы позволить пользователю просто вставить свою собственную кнопку в
    https://forums.xamarin.com/discussion/comment/161435/#Comment_161435,
    и это тот метод, который я сейчас пытаюсь имплицировать / модифицировать. К сожалению, у меня нет доступа к Xamarin.


Хотя шаблон вставляется при запуске кода, шаблон не обновляет кнопку правильно. Если я помещу точку останова в сеттер MyButton, то увижу, что это значение на самом деле является пустой кнопкой, а не той, которую я назначил в своем главном окне. Как мне это исправить?

Вот немного упрощенный код:

XAML-код моего шаблона пользовательского элемента управления по :

<UserControl x:Class="TemplateCode.Template"

     x:Name="TemplatePage"

     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

     mc:Ignorable="d"

     d:DesignHeight="350"

     d:DesignWidth="525"

     DataContext="{Binding RelativeSource={RelativeSource Self}}"

     Background="DarkGray">

     <Grid>
          <Button x:Name="_button" Width="200" Height="100" Content="Template Button"/>
     </Grid>
</UserControl>

За код моего шаблона пользовательского элемента управления по :

using System.Windows.Controls;

namespace TemplateCode
{
    public partial class Template : UserControl
    {
        public static Button DefaultButton;

        public Template()
        {
             InitializeComponent();
        }

        public Button MyButton
        {
            get
            {
                 return _button;
            }
            set
            {
                _button = value; //I get here, but value is a blank button?!

                // Eventually, I'd like to do something like:
                // Foreach (property in value) 
                // {
                //     If( value.property != DefaultButton.property) )
                //     {
                //         _button.property = value.property;
                //     }
                // }
                // This way users only have to update some of the properties
            }
        }
    }
}

А теперь приложение, где я хочу его использовать:

<Window x:Class="TemplateCode.MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    mc:Ignorable="d"



    xmlns:templateCode="clr-namespace:TemplateCode"



    Title="MainWindow"

    Height="350"

    Width="525"

    Background="LimeGreen"

    DataContext="{Binding RelativeSource={RelativeSource Self}}" >

    <Grid>
        <templateCode:Template>
            <templateCode:Template.MyButton>

                <Button Background="Yellow" 

                    Content="Actual Button"

                    Width="200" 

                    Height="100"/>

            </templateCode:Template.MyButton>
        </templateCode:Template>
    </Grid>
</Window>

А теперь код позади:

Using System.Windows;
Namespace TemplateCode
{
    Public partial class MainWindow : Window
    {
        Public MainWindow()
        {
            InitializeComponent();
        }
    }
}

0 Ответов