2009-08-07 21 views
0

我有一個ControlTemplate,它在多個元素中使用相同的顏色。在某些觸發器(例如OnMouseOver)上,我想更改該顏色。據我所見,我必須爲每個元素定義一個setter來改變它的顏色。有沒有辦法引用模板中的所有包含元素都可以訪問的共享資源,哪些可以通過觸發器進行更改,因此我不必處理每個元素?更改ControlTemplate中的常見顏色

下面是一個(由)例如:

<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}"> 
    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <Ellipse Fill="red" Grid.Column="0"/> 
    <Ellipse Fill="red" Grid.Column="1"/> 
    <ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/> 
</Grid> 
</ControlTemplate> 

當控制被禁用,我想要的橢圓是灰色的,而不明確設置他們的兩個,例如我想寫

<Trigger Property="IsEnabled" Value="False"> 
    <Setter TargetName="_ellipse1" Property="Fill" Value="Grey"/> 
    <Setter TargetName="_ellipse2" Property="Fill" Value="Grey"/> 
</Trigger> 

但同時設置了橢圓的顏色只有一個制定者。

回答

2

廣場上的橢圓風格(ellipsi?),而不是按鈕觸發。如果您在Button上設置了IsEnabled = false,IsEnabled將向下傳播。

<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}"> 
    <ControlTemplate.Resources> 
     <Style TargetType="{x:Type Ellipse}"> 
      <Setter Property="Fill" Value="Red" /> 
      <Style.Triggers> 
       <Trigger Property="IsEnabled" Value="False"> 
        <Setter Property="Fill" Value="Gray" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ControlTemplate.Resources> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Ellipse Grid.Column="0"/> 
     <Ellipse Grid.Column="1"/> 
     <ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/> 
    </Grid> 
</ControlTemplate> 
+0

這樣做最簡單的方法,謝謝。 (儘管我必須弄清楚,你不能在ControlTemplate中定義顏色,而只能在樣式中定義顏色。) – 2009-08-09 07:53:33

+0

謝謝 - 正是我需要的語法 – 2010-05-10 15:24:52

1

我認爲最好的方法是使用一個值轉換器。那麼你可以完全避免一個混亂的觸發器。這裏是你的例子,但添加了一個轉換器。

<Window.Resources> 
    <local:EnabledToColorConverter x:Key="enabledToColorConverter"/> 
    <ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Ellipse Name="_ellipse1" Fill="{TemplateBinding IsEnabled, Converter={StaticResource enabledToColorConverter}}" Grid.Column="0"/> 
     <Ellipse Name="_ellipse2" Fill="{TemplateBinding IsEnabled, Converter={StaticResource enabledToColorConverter}}" Grid.Column="1"/> 
     <ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/> 
    </Grid> 
    </ControlTemplate> 
</Window.Resources> 

<StackPanel> 
    <Button Template="{StaticResource myTemplate}">Enabled Button</Button> 
    <Button Template="{StaticResource myTemplate}" IsEnabled="False">Disabled Button</Button> 
</StackPanel> 

這裏是轉換器:

public class EnabledToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool isEnabled = (bool)value; 
     return isEnabled ? 
      Brushes.Red : 
      Brushes.Gray; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

這是非常醜陋的解決方案,因爲顏色是硬編碼的值轉換器(不幸的是,IValueConverter.Convert只需要一個參數),但可能做的伎倆。我會嘗試的。 – 2009-08-07 22:36:12

+0

不,您可以在綁定上使用ConverterParameter並傳遞不同的顏色。或者您可以靜態定義顏色並以這種方式訪問​​它們。 – Charlie 2009-08-07 22:40:34