在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;
但我失败了。
答案 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 ,并为其指定一个键。