2009-11-24 81 views
20

我在写一个WPF控件,它的子类是一个Button。我再提供主题\ generic.xaml默认样式,看起来像这样(简化):WPF ControlTemplate:如何为TemplateBinding提供默认值?

<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> 

我想用户必须改变控件的背景下的机会,但如果他没有,我想提供默认值。我该怎么做?除非用户明确指定它们(这有效地强制用户总是提供一些值),但是标准的Windows控件(如Button)不会显示在背景和BorderBrush中(不存在)提供默认外观,仍然可以由用户自定义。如何在我的控制下做到这一点?

谢谢!

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

您可以提供的默认值作为制定者的风格:

<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> 

回答

15

你可以根据你的风格定义两个属性的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}" /> 
+1

很酷,这就是我想知道的。我在问题中添加了解决方案。谢谢! – 2009-11-25 04:14:57

2

在声明依赖属性为您控制您也声明默认为UIPropertyMetadata

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

你能做到这一点的另一种方式是通过设置默认的颜色在您的自定义控件的构造,如之前的任何属性由用户,如果用户未设置他们所设定的构造函数总是被调用会默认为你的。事实上,它们总是会被你设置,然后任何用户设置都会覆盖你的设置。如果你想设置你实际上没有创建的背景属性,这些属性来自你继承的基类,这尤其有效。

+1

谢谢,但我使用从祖先附加的属性,所以具有默认值的技巧是不可能的。 至于在构造函数中设置它 - 这是在代码中写xaml(这不应该是必要的),并且它不能通过模板进行更改,所以我不认为这是Microsoft的控件如何执行它。 – 2009-11-25 04:01:04

2

也可以通过创建样本实例“继承”了Button元素的默认样式并参考其属性:

<Button x:Key="DefaultButton"/> 

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

关注秒字符串,我将黑色设置为背景默认值。

相关问题