2010-08-21 68 views
0

我正在使用ControlTemplate來定義WPF應用程序中按鈕的外觀。此外,我想使用樣式來設置我的按鈕的某些方面。這些樣式應該在ControlTemplate定義,如(簡化的)元件設置屬性:如何使用樣式更改模板化控件

<Window.Resources> 
    <ControlTemplate x:Key="Template1" TargetType="Button"> 
     <Grid> 
      <Rectangle Name="rect" Fill="White" Stroke="Blue" StrokeThickness="2"/> 
      <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
     </Grid> 
    </ControlTemplate> 
    <Style x:Key="Style1" TargetType="Button" > 
     <Setter TargetName="rect" Property="Fill" Value="Red"/> 
    </Style> 
</Window.Resources> 

現在,編譯器抱怨說,的TargetName「矩形」是不是一個有效目標,我可以自一個untemplatized Button沒有按」理解t包含名爲「rect」的元素。

我知道我可以改變樣式來設置完整的模板,但我想避免這種情況(因爲模板比這裏顯示的要複雜得多,我不想爲每種樣式複製它... )

是否有可能實現此行爲?也許通過設置TargetType對不對?任何其他想法?

回答

1

您可以不是只覆蓋部分控件模板。你可以改變一切或不改變。

儘管你可以在樣式上擁有屬性的setter。

1

標準模式是在控件模板中使用TemplateBinding綁定到控件本身的屬性,然後在該樣式中設置控件的屬性。例如:

<Window.Resources> 
    <ControlTemplate x:Key="Template1" TargetType="Button"> 
     <Grid> 
      <Rectangle Name="rect" Fill="{TemplateBinding Background}" Stroke="Blue" StrokeThickness="2"/> 
      <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
     </Grid> 
    </ControlTemplate> 
    <Style x:Key="Style1" TargetType="Button" > 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</Window.Resources> 

這會將rect上的Fill屬性綁定到Button上的Background屬性。該樣式將背景屬性設置爲紅色,這將導致填充設置爲紅色。

爲了設置默認值,你通常會創建一個模板設置,以及其他屬性的樣式:

<Window.Resources> 
    <Style x:Key="BaseStyle" TargetType="Button"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <Grid> 
         <Rectangle Name="rect" Fill="{TemplateBinding Background}" Stroke="Blue" StrokeThickness="2"/> 
         <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Background" Value="White"/> 
    </Style> 
    <Style x:Key="Style1" TargetType="Button" BasedOn="{StaticResource BaseStyle}"> 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</Window.Resources> 

第一個樣式將應用模板,並設置背景白色的,所以矩形將是白色的。第二種風格從第一種風格繼承,但將背景設置爲紅色,因此矩形將變爲紅色。

相關問題