Как изменить стиль элемента управления, вложенного в настраиваемый элемент управления?
Предположим, что вы разрабатываете настраиваемый элемент управления в WPF, который внутри содержит некоторые другие базовые элементы управления. Для простоты предположим, что он содержит 2 кнопки .
Теперь вы хотите использовать этот настраиваемый элемент управления в своем приложении, но хотите немного изменить его стиль .
ДЕЛО 1
Если в определении настраиваемого элемента управления обе кнопки имеют одинаковый стиль (по умолчанию wpf), и вы хотите изменить стиль обеих, это должно быть легко:
<mc:MyControl>
<mc:MyControl.Resources>
<Style x:Key={x:Type Button}, TargetType={x:Type Button}>
<!-- Insert the new style here -->
</Style>
</mc:MyControl.Resources>
<mc:MyControl>
СЛУЧАЙ 2
Если в определении настраиваемого элемента управления обе кнопки имеют одинаковый стиль (по умолчанию wpf), но вы хотите изменить их стиль с помощью двух разных стилей , как лучше всего решить эту проблему?
СЛУЧАЙ 3
Если в определении настраиваемого элемента управления обе кнопки имеют одинаковый стиль, который относится к стилю, определенному внутри настраиваемого элемента управления , и вы хотите изменить их стиль , как лучше всего решить эту проблему?
Заранее спасибо за помощь
Ответов (1)1
Вы можете определить 2 разных свойства Style в своем настраиваемом элементе управления и связать их со свойством Style отдельных кнопок , что позволит клиентам устанавливать стиль для двух элементов управления независимо друг от друга.
XAML файл:
<UserControl x:Class="MyNamespace.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="MyControl">
<StackPanel>
<Button Name="FirstButton"
Style={Binding ElementName=MyControl, Path=FirstButtonStyle}
Content="First Button" />
<Button Name="SecondButton"
Style={Binding ElementName=MyControl, Path=SecondButtonStyle}
Content="Second Button" />
</StackPanel>
</UserControl>
Файл кода программной части:
using System;
using System.Windows;
using System.Windows.Controls;
namespace MyNamespace
{
[StyleTypedProperty(
Property = "FirstButtonStyle",
StyleTargetType = typeof(Button))]
[StyleTypedProperty(
Property = "SecondButtonStyle",
StyleTargetType = typeof(Button))]
public partial class MyControl : UserControl
{
public static readonly DependencyProperty FirstButtonStyleProperty =
DependencyProperty.Register(
"FirstButtonStyle",
typeof(Style),
typeof(MyControl)
);
public Style FirstButtonStyle
{
get { return (Style)GetValue(FirstButtonStyleProperty); }
set { SetValue(FirstButtonStyleProperty, value); }
}
public static readonly DependencyProperty SecondButtonStyleProperty =
DependencyProperty.Register(
"SecondButtonStyle",
typeof(Style),
typeof(MyControl)
);
public Style SecondButtonStyle
{
get { return (Style)GetValue(SecondButtonStyleProperty); }
set { SetValue(SecondButtonStyleProperty, value); }
}
}
}
Рекомендуется реализовать эти 2 свойства как свойства зависимостей, поскольку это заставит их соответствовать другим свойствам стиля в стандартных элементах управления WPF.
Теперь вы можете установить стиль для кнопок, как в любом элементе управления WPF:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:MyNamespace"
Title="MyControl Sample"
Height="300"
Width="300">
<Window.Resources>
<Style x:Key="GreenButton" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Green" />
</Style>
<Style x:Key="RedButton" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Red" />
</Style>
</Windows.Resources>
<StackPanel>
<local:MyControl FirstButtonStyle="{StaticResource GreenButton}"
SecondButtonStyle="{StaticResource RedButton}" />
</StackPanel>
</Window>
В качестве альтернативы вы можете использовать один и тот же стиль для двух кнопок , выставив одно свойство в вашем настраиваемом элементе управления, которое вы привязываете к свойству Style обоих внутренних элементов управления.
ОБНОВИТЬ
Вам не нужно определять свойства FirstButtonStyle и SecondButtonStyle как свойства зависимостей. Важно то, что внутренние привязки к свойствам стиля кнопок обновляются при изменении их значения. Это можно сделать, реализовав интерфейс INotifyPropertyChanged в пользовательском элементе управления и вызвав событие OnPropertyChanged в установщиках свойств.
Вы также можете назначить «стиль по умолчанию» двум свойствам в конструкторе пользовательского элемента управления. Вот пример:
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
namespace MyNamespace
{
[StyleTypedProperty(
Property = "FirstButtonStyle",
StyleTargetType = typeof(Button))]
[StyleTypedProperty(
Property = "SecondButtonStyle",
StyleTargetType = typeof(Button))]
public partial class MyControl : UserControl, INotifyPropertyChanged
{
private Style firstButtonStyle;
private Style secondButtonStyle;
public MyControl()
{
Style defaultStyle = new Style();
// assign property setters to customize the style
this.FirstButtonStyle = defaultStyle;
this.SecondButtonStyle = defaultStyle;
}
public Style FirstButtonStyle
{
get { return firstButtonStyle; }
set
{
firstButtonStyle = value;
OnPropertyChanged("FirstButtonStyle");
}
}
public Style SecondButtonStyle
{
get { return secondButtonStyle; }
set
{
secondButtonStyle = value;
OnPropertyChanged("SecondButtonStyle");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}