6

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;

しかし、私は失敗しました。

4

2 に答える 2

6

リソースディクショナリの値を直接上書きできます。

例えば:

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

そうは言っても、私は通常これをしないことをお勧めします。代わりに、それぞれ独自のキーを持つ2セットの色を用意し、何らかのメカニズムを使用して、実行時にどの色を値に割り当てるかを切り替えます。これにより、このロジック全体をxaml自体に残すことができます。

于 2012-11-15T18:14:23.607 に答える
3

私はそれを解決しました。LinearGradientBrushのみが色のDynamicResourceをサポートしていないようです。ダイナミックカラーを上書きしても、LinearGradientBrush自体は更新されません。PS:SolidColorBrushは実行時の色の変更をサポートしています。代わりに、以下のことを行ってください。

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

LinearGradientBrushがリソースディクショナリで定義されたネストされた複雑なブラシに隠されている場合は、LinearGradientBrush出現させ、それにキーを割り当てます。

于 2012-11-16T16:47:19.137 に答える