У меня есть пользовательский элемент управления шаблоном XAML с кнопками внутри. Как элегантно изменить свойства каждой кнопки?
На работе у меня есть несколько страниц, каждая с кнопками в тех же местах и с теми же свойствами. Каждая страница также имеет незначительные отличия. Для этого мы создали шаблон userControl и поместили в него все кнопки, а затем применили этот пользовательский элемент управления ко всем страницам. Однако теперь довольно трудно получить доступ к кнопкам и изменить их из xaml каждой страницы, потому что они находятся внутри пользовательского элемента управления на странице..... Как мне элегантно получить доступ к кнопкам с каждой страницы?
Что я хочу сделать, так это позволить пользователю установить свою собственную кнопку где-нибудь в xaml и украсть любые обновленные свойства для моей кнопки.
Что я уже пробовал:
- В настоящее время мы привязываемся к куче свойств зависимостей. Мне не нравится этот вариант, потому что у меня много кнопок, и мне нужно управлять многими свойствами этих кнопок. В результате получаются сотни свойств зависимостей и настоящий беспорядок, через который приходится пробираться, когда нам нужно что-то изменить.
- Другой метод заключается в использовании стилей. В целом мне нравится этот метод, но поскольку эти кнопки находятся внутри другого элемента управления, их становится трудно изменить, и шаблон будет точно подходить только для одной кнопки в одно время.
- Другой способ-использовать триггеры данных, но у этого есть та же проблема-я должен полагаться на кучу нескольких свойств зависимостей
- Адам Кемп написал о том, чтобы позволить пользователю просто вставить свою собственную кнопку в
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(); } } }