WPF ControlTemplate:如何为TemplateBinding提供默认值? [英] WPF ControlTemplate: How to provide a default value for TemplateBinding?
问题描述
我正在编写一个WPF控件,该控件将Button子类化.然后,我在Themes \ generic.xaml中提供一个默认样式,如下所示(简化):
I am writing a WPF control that subclasses a Button. I then provide a default style in Themes\generic.xaml, that looks like this (simplified):
<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>
我希望用户有机会更改控件的背景,但是如果他没有,我想提供默认值.我该怎么办?
I would like the user to have the opportunity to change the control's background, but if he doesn't, I'd like to provide default value. How do I do it?
当我像在发布的代码中那样执行操作时,除非用户明确指定它们(实际上迫使用户始终提供一些值),否则Background和BorderBrush为null(=不存在),但是标准的Windows控件(如Button)提供了默认外观,仍可以由用户自定义.如何在我的控制下做到这一点?
When I do it like in the posted code, the Background and BorderBrush is null (= nonexistent) unless user explicitly specifies them (which effectively forces user to always provide some value), but the standard windows controls (like Button) provide a default look, that can still be customized by user. How to do this in my control?
谢谢!
迈克尔·莫顿(Michael Morton)的解决方案:
您可以在样式中提供默认值作为设置器:
You can provide defaults as setters in style:
<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>
推荐答案
您可以在样式中为所讨论的两个属性定义设置器.
You can just define setters on your style for the two properties in question.
例如,一些通用定义:
<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"/>
然后,在您的样式定义中:
Then, in your style definition:
<Setter Property="Background" Value="{StaticResource ButtonNormalBackground}" />
<Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}" />
这篇关于WPF ControlTemplate:如何为TemplateBinding提供默认值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!