На работе у меня есть несколько страниц, каждая с кнопками в тех же местах и с теми же свойствами. Каждая страница также имеет незначительные отличия. С этой целью мы создали шаблон UserControl и поместили в него все кнопки, а затем применили этот пользовательский элемент управления ко всем страницам. Однако теперь довольно сложно получить доступ к кнопкам и изменить их с каждой страницы xaml, потому что они находятся внутри UserControl на странице..... Как мне элегантно получить доступ к кнопкам с каждой страницы?
Что я пробовал:
-
В настоящее время мы связываемся с связью свойств зависимостей. Мне не нравится этот вариант, потому что у меня много кнопок, и вам нужно управлять множеством свойств на этих кнопках. Результатом являются сотни свойств зависимостей и реальный беспорядок, который нужно пропустить, когда нам нужно что-то изменить.
-
Другой способ - использовать стили. Мне нравится этот метод в целом, но поскольку эти кнопки находятся внутри другого элемента управления, становится сложно их модифицировать, и шаблон будет точно соответствовать только одной кнопке за один раз.
-
Adam Kemp опубликовал о том, чтобы позволить пользователю просто вставить свою собственную кнопку здесь, и это метод я в настоящее время пытается внедрить/изменить. К сожалению, у меня нет доступа к Xamarin.
Хотя шаблон вставляется при запуске кода, шаблон не обновляет кнопку правильно. Если я установил точку останова в MyButton Setter, я вижу, что значение на самом деле является пустой, а не той, которую я назначил в своем главном окне. Как это исправить?
Здесь приведен упрощенный код:
Мой шаблон UserControl 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>
Мой шаблон UserControl Code Behind:
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();
}
}
}
Изменить: Пока я хочу удалить ненужные свойства зависимостей в шаблоне userControl, мне все равно хотелось бы установить привязки свойств кнопки из XAML.