2009-11-24 79 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> 

關注秒字符串,我將黑色設置爲背景默認值。

相關問題