Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF ControlTemplate:如何为TemplateBinding提供默认值?_Wpf_Styles_Default_Controltemplate_Templatebinding - Fatal编程技术网

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

WPF ControlTemplate:如何为TemplateBinding提供默认值?,wpf,styles,default,controltemplate,templatebinding,Wpf,Styles,Default,Controltemplate,Templatebinding,我正在编写一个WPF控件,它是一个按钮的子类。然后,我在Themes\generic.xaml中提供了一个默认样式,如下所示(简化): 我希望用户有机会更改控件的背景,但如果他没有,我希望提供默认值。我该怎么做 当我在发布的代码中这样做时,背景和边界笔刷为null(=不存在),除非用户明确指定它们(这有效地迫使用户始终提供一些值),但标准windows控件(如按钮)提供默认外观,用户仍可以自定义。如何在我的控制下做到这一点 谢谢大家! 迈克尔·莫顿的解决方案: 您可以在样式中提供默认设置为s

我正在编写一个WPF控件,它是一个按钮的子类。然后,我在Themes\generic.xaml中提供了一个默认样式,如下所示(简化):


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

当我在发布的代码中这样做时,背景和边界笔刷为null(=不存在),除非用户明确指定它们(这有效地迫使用户始终提供一些值),但标准windows控件(如按钮)提供默认外观,用户仍可以自定义。如何在我的控制下做到这一点

谢谢大家!

迈克尔·莫顿的解决方案:

您可以在样式中提供默认设置为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>

显蓝色
自然红

当为控件声明依赖项属性时,也将默认值声明为UIPropertyMetadata

此属性默认为Brusks.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));

另一种方法是在自定义控件的构造函数中设置默认颜色,因为构造函数总是在用户设置任何属性之前被调用,如果用户未能设置它们,它们将默认为您的属性。事实上,它们总是由您设置,然后任何用户设置都将覆盖您的设置。如果您想要设置属性(例如,您没有实际创建的背景、来自您的基础类的属性以及您从中继承的基类),则此方法非常有效。

您可以在样式上为所讨论的两个属性定义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}" />

还可以通过创建示例实例并引用其属性来“继承”
按钮的默认样式

<Button x:Key="DefaultButton"/>

<Style TargetType="{x:Type TestTemplate:MyButton}">
        <Setter Property="Background"
                Value="{Binding Path=Background, Source={StaticResource DefaultButton}}" />
</Style>



请注意second字符串,我将黑色设置为背景默认值。

谢谢,但我使用的是来自祖先的附加属性,因此无法使用默认值的技巧。至于在构造函数中设置它,那就是在代码中编写xaml(这应该不是必需的),而且它不能被模板更改,所以我不认为微软的控件是这样做的。酷,这就是我想知道的。我把你的答案加在这个问题上了。谢谢回答得好!现在我可以在特定控件上指定自定义背景。。。
<Button x:Key="DefaultButton"/>

<Style TargetType="{x:Type TestTemplate:MyButton}">
        <Setter Property="Background"
                Value="{Binding Path=Background, Source={StaticResource DefaultButton}}" />
</Style>
<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>