假设您正在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
如果在自定义控件定义中,两个按钮具有相同的样式,引用自定义控件中定义的样式,并且您想重新设置它们,那么解决它的最佳方法是什么?
提前感谢您的所有帮助
答案 0 :(得分:5)
您可以在自定义控件中定义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); }
}
}
}
将这两个属性作为依赖项属性实现是一个好主意,因为这将使它们符合标准WPF控件中的其他Style属性。
现在,您可以像在任何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>
或者,您可以通过在自定义控件中公开单个属性来共享2个按钮共享相同的样式,该属性绑定到两个内部控件的Style属性。
<强>更新强>
您不必将 FirstButtonStyle 和 SecondButtonStyle 属性定义为依赖项属性。重要的是,按钮的样式属性的内部绑定会在其值发生更改时更新。您可以通过在用户控件中实现 INotifyPropertyChanged 界面来完成此操作,并在属性设置器中引发 OnPropertyChanged 事件。
您还可以为用户控件的构造函数中的2个属性指定“默认样式”。这是一个例子:
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));
}
}
}
}