如何在运行时更改资源字典颜色

时间:2012-11-15 18:12:10

标签: c# wpf

在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#中更改运行时中的Color元素。 LinearGradientBrush应该动态更改吗?

我希望做这样的事情:

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

但我失败了。

2 个答案:

答案 0 :(得分:5)

您可以直接覆盖资源字典中的值。

例如:

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

话虽如此,我通常建议不要这样做。相反,我会有两组颜色,每组都有自己的键,并使用一些机制来切换在运行时为您的值分配哪种颜色。这使您可以在xaml本身中保留整个逻辑。

答案 1 :(得分:3)

我刚解决了。看起来只有 LinearGradientBrush 不支持 DynamicResource 颜色。即使你覆盖动态颜色, LinearGradientBrush 本身也不会更新。 PS: SolidColorBrush 支持运行时颜色更改。请改为:

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

如果 LinearGradientBrush 隐藏在资源字典中定义的嵌套复杂画笔中,则会出现 LinearGradientBrush ,并为其指定一个键。