WPF ControlTemplate:如何为模板键入提供默认值?
-
22-09-2019 - |
题
我正在编写一个wpf控件,该控件将按下一个按钮。然后,我在主题 generic.xaml中提供默认样式,看起来像这样(简化):
<Style TargetType="{x:Type WPFControls:MyButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type WPFControls:MyButton}">
<Button
x:Name="PART_Button"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我希望用户有机会更改控件的背景,但是如果他不这样做,我想提供默认值。我该怎么做?
当我像在已发布的代码中这样做时,背景和边界刷为null(= notxistent),除非用户明确指定它们(这有效地迫使用户始终提供一些值),但是标准的Windows控件(如按钮)提供默认外观,这仍然可以由用户自定义。如何在我的控制中做到这一点?
谢谢!
迈克尔·莫顿的解决方案:
您可以在样式中提供默认设置:
<Style TargetType="{x:Type TestTemplate:MyButton}">
<Setter Property="Background" Value="Red" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TestTemplate:MyButton}">
<Button
x:Name="PART_Button"
IsEnabled="{TemplateBinding IsEnabled}"
Content="{TemplateBinding Content}"
Background="{TemplateBinding Background}"
/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
用法:
<StackPanel>
<TestTemplate:MyButton Background="Blue">Explicitly blue</TestTemplate:MyButton>
<TestTemplate:MyButton>Naturally red</TestTemplate:MyButton>
</StackPanel>
解决方案
您可以为所讨论的两个属性定义样式上的设定器。
例如,一些一般定义:
<LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#F3F3F3" Offset="0"/>
<GradientStop Color="#EBEBEB" Offset="0.5"/>
<GradientStop Color="#DDDDDD" Offset="0.5"/>
<GradientStop Color="#CDCDCD" Offset="1"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
然后,按照您的样式定义:
<Setter Property="Background" Value="{StaticResource ButtonNormalBackground}" />
<Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}" />
其他提示
<Style TargetType="{x:Type WPFControls:MyButton}">
<Setter Property="Background" Value="Black">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type WPFControls:MyButton}">
<Button
x:Name="PART_Button"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
请注意Seccond String,我将黑色设置为背景默认值。
当您声明控件的依赖属性时,您还将默认值声明为uipropertymetadata
如您在最后一行中所看到的,此属性默认为brush.red。
public Brush MyBrush {
get { return (Brush)GetValue(MyBrushProperty); }
set { SetValue(MyBrushProperty, value); }
}
public static readonly DependencyProperty MyBrushProperty =
DependencyProperty.Register("MyBrush", typeof(Brush), typeof(MyQsFeature), new UIPropertyMetadata(Brushes.Red));
您可以做到的另一种方式是,在自定义控件的构造函数中设置默认颜色,因为如果用户未能设置它们,则在用户设置任何属性之前,构造函数始终被调用。实际上,他们总是会被您设置,然后任何用户设置都会覆盖您的。如果您想设置您实际上并未创建的背景之类的属性,那是从您继承的基础类中的,这是有效的。
也可以“继承” Button
元素通过创建示例实例并引用其属性:
<Button x:Key="DefaultButton"/>
<Style TargetType="{x:Type TestTemplate:MyButton}">
<Setter Property="Background"
Value="{Binding Path=Background, Source={StaticResource DefaultButton}}" />
</Style>
不隶属于 StackOverflow