2012-11-15 75 views
5

在XAML:如何改變資源字典顏色在運行時

<ResourceDictionary> 
    <Color x:Key="BrushColor1">Red</Color> 
    <Color x:Key="BrushColor2">Black</Color> 

    <LinearGradientBrush x:Key="GradientBrush1" StartPoint="0,0.5" EndPoint="1,0.5"> 
     <GradientStop Color="{DynamicResource BrushColor2}" Offset="0" /> 
     <GradientStop Color="{DynamicResource BrushColor1}" Offset="1" /> 
    </LinearGradientBrush> 
</ResourceDictionary> 

在C#:

public void CreateTestRect() 
    { 
     Rectangle exampleRectangle = new Rectangle(); 
     exampleRectangle.Width = 150; 
     exampleRectangle.Height = 150; 
     exampleRectangle.StrokeThickness = 4; 
     exampleRectangle.Margin = new Thickness(350); 

     ResourceDictionary resources = this.Resources; 
     resources["BrushColor1"] = Colors.Pink; 
     resources["BrushColor2"] = Colors.RoyalBlue; 
     Brush brush =(Brush)this.FindResource("GradientBrush1"); 

     exampleRectangle.Fill = brush; 
     canvas.Children.Insert(0, exampleRectangle); 
    } 

如何改變在C#運行時的色彩元素。 LinearGradientBrush應該動態更改?

我願做這樣的事情:

(Color)(this.FindResource("BrushColor1")) = Colors.Pink; 

,但我失敗了。

回答

5

您可以直接覆蓋資源字典中的值。

例如:

ResourceDictionary resources = this.Resources; // If in a Window/UserControl/etc 
resources["BrushColor1"] = System.Windows.Media.Colors.Black; 

話雖這麼說,我通常會建議不這樣做。相反,我會有兩組顏色,每組都有自己的鍵,並使用一些機制來切換在運行時將相應顏色分配給您的值。這可以讓你在xaml中保留整個邏輯。

+0

我試過了,但仍然無法改變畫布上的顏色。無論如何,謝謝你。 – dongx

+0

@XiaoruiDong這不起作用 - 你需要找到存儲它的實際資源字典來改變它。 –

+1

我剛解決了它。看起來只有** LinearGradientBrush **不支持** DynamicResource **。其餘的畫筆如** SolidColorBrush **支持它。 – dongx

2

我剛解決了它。看起來像只LinearGradientBrush不支持DynamicResource的顏色。即使你覆蓋動態顏色,LinearGradientBrush本身不會得到更新。 PS:SolidColorBrush支持運行時顏色更改。做一些事情,而不是下面:

LinearGradientBrush linearGradientBrush = (LinearGradientBrush)(this.FindResource("GradientBrush1")); 
linearGradientBrush.GradientStops[0].Color = color1; 
linearGradientBrush.GradientStops[1].Color = color2; 

如果一個LinearGradientBrush被隱藏在資源字典中界定的巢複雜的刷,你讓一個LinearGradientBrush出現,並分配一個鑰匙。

相關問題