wpf - WPF ControlTemplate:如何为TemplateBinding提供默认值?

标签 wpf styles default controltemplate templatebinding

我正在编写一个WPF控件,该控件将Button子类化。然后,我在Themes \ 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>

我希望用户有机会更改控件的背景,但是如果他没有,我想提供默认值。我该怎么做?

当我像在已发布的代码中那样执行操作时,除非用户明确指定它们(实际上迫使用户始终提供一些值),否则Background和BorderBrush为null(=不存在),但是标准的Windows控件(如Button)提供了默认外观,仍然可以由用户自定义。如何控制我?

谢谢!

Michael Morton解决方案:

您可以提供默认值作为样式的 setter :
<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>

最佳答案

您可以在样式中为两个相关属性定义setter。

例如,一些一般定义:

<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}" />

关于wpf - WPF ControlTemplate:如何为TemplateBinding提供默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1793611/

相关文章:

c# - WPF TabControl with Materials Design(没有 Dragablz)

javascript - 如何在c#中的wpf webbrowser控件中注入(inject)js文件

c# - Entity Framework 和抽象类

html - 如何在不使用 <span> 标记的情况下从 CSS 文件替换 <h1> 中的文本?

javascript - 如何仅针对 hasOwnProperty false 属性将 Object.assign() 默认值分配给另一个部分完整的对象?

wpf - 在 WPF 中测量文本

html - 为什么 Angular 中的 index.html 没有应用样式表?

wpf - 将样式的 TargetType 属性设置为基类

c++ - 澄清琐碎的破坏者

database - Backand - 创建对象后添加默认值