web-dev-qa-db-ja.com

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. 現在使用されているスタイルの色を反映する、スタイルのピンク色、たとえばボタンの背景にbindすることは可能ですか?

編集:
For 1私が試した:

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

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

しかし、例外が発生しました:

「SetterBase」が使用された(封印された)後は、変更できません。

20
serhio

リソースとしてブラシを作成する

<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を使用すると、この動作は得られません。

24
Isak Savo

スタイルは、初めて使用する前にのみ変更できます。 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));
19
Thomas Levesque