2010-09-29 120 views
14

是否有方法在WPF中動態更改(並應用)樣式?在WPF中動態更改樣式

說我有在XAML聲明的風格:

<Style TargetType="local:MyLine" 
      x:Key="MyLineStyleKey" x:Name="MyLineStyleName"> 
     <Setter Property="Fill" Value="Pink"/> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="true"> 
       <Setter Property="Fill" Value="Blue" />      
      </Trigger> 
     </Style.Triggers> 
    </Style> 
  1. 在一個時刻,我需要變化Pink顏色,來,說Green,並與風格MyLineStyleKey所有行成爲綠色。一行在釋放時是粉紅色的,當選擇時是藍色的......現在,我需要更改未選中的屬性(粉紅色到綠色)...,所以這不僅僅是將其設置爲其他顏色,觸發器(選擇>藍色)將不再工作......這可能嗎?怎麼樣?

  2. 是否可以通過綁定到樣式中的Pink顏色,比如說,一個Button背景,它將反映當前使用的樣式顏色?

編輯:
對於我嘗試:

Style s = (Style)this.Resources["MyLineStyleKey"]; 

(s.Setters[0] as Setter).Value = background; 
(s.Setters[1] as Setter).Value = background; 

但一個例外發生:

一個 'SetterBase' 之後是在使用 (密封),它不能修改。

+0

這可以通過動詞來完成。 – Wernight 2010-09-29 12:33:38

回答

23

創建畫筆作爲資源

<SolidColorBrush x:Key="MyFillBrush" Color="Pink" /> 

,並參考在你的風格

<Style x:Key="MyShapeStyle" TargetType="Shape"> 
    <Setter Property="Fill" Value="{DynamicResource MyFillBrush}" /> 
</Style> 
... 
<!-- Then further down you may use it like this --> 
<StackPanel Width="100"> 
    <Rectangle Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" /> 
    <Rectangle Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" /> 
    <Ellipse Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" /> 
    <Button Content="Click to change color" Click="Button_Click" Margin="8" /> 
</StackPanel> 

現在去陳戈認爲,使用「MyShapeStyle」樣式的所有形狀的顏色,你可以從你的代碼隱藏做到以下幾點:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Random r = new Random(); 
    this.Resources["MyFillBrush"] = new SolidColorBrush(Color.FromArgb(
      0xFF, 
      (byte)r.Next(255), 
      (byte)r.Next(255), 
      (byte)r.Next(255))); 
} 

,使這項工作的事情是事實,你使用DynamicResource的刷參考在你的風格 - 這告訴WPF監視該資源的變化。如果您改用StaticResource,則不會出現此現象。

+0

問題:我可以通過動態刷新WPF的用戶控件? – serhio 2010-09-29 14:41:49

+0

我不知道你的意思是「通過」,但你肯定可以從你的用戶控件引用它,即使它是在層次結構中更高的控件上定義的(例如在窗口上)。 – 2010-09-30 07:14:03

+0

此解決方案可能會解決問題,但它並不完全回答所提問題 – peter70 2016-02-12 08:39:58

15

風格只能在第一次使用之前修改。來自MSDN:

樣式在另一種樣式基於它或第一次應用時被封閉。

相反,你可以創建基於現有的風格一種新的風格,和替換的屬性你想要的:

Style newStyle = new Style(); 
newStyle.BasedOn = originalStyle; 
newStyle.TargetType = typeof(MyLine); 
Brush blue = new SolidColorBrush(Colors.Blue); 
newStyle.Setters.Add(new Setter(Shape.FillProperty, blue)); 
newStyle.Setters.Add(new Setter(Shape.StrokeProperty, blue)); 
+0

哦...我有一個觸發器的風格...一條線是粉紅色的時候被釋放,而藍色時被選中...現在,我需要改變未選中的屬性...,所以這不僅僅是設置它另一種顏色,觸發器(選擇>藍色)將不再起作用... – serhio 2010-09-29 13:01:25

+0

更新了詳細的問題.. – serhio 2010-09-29 13:04:25

+0

hm ...我想,如果我將從樣式中分離所有行,我將不能修改它,一旦使用... – serhio 2010-09-29 13:15:01