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>
すぐに、変更Pink
の色、つまりGreen
にする必要があり、スタイルMyLineStyleKey
のすべての線が緑になりました。線が解放されるとピンクになり、選択されるとブルーになります...次に、選択されていないプロパティ(ピンクからグリーン)を変更する必要があります。 )動作しなくなります...それは可能ですか?どうやって?
現在使用されているスタイルの色を反映する、スタイルのピンク色、たとえばボタンの背景にbindすることは可能ですか?
編集:
For 1私が試した:
Style s = (Style)this.Resources["MyLineStyleKey"];
(s.Setters[0] as Setter).Value = background;
(s.Setters[1] as Setter).Value = background;
しかし、例外が発生しました:
「SetterBase」が使用された(封印された)後は、変更できません。
リソースとしてブラシを作成する
<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
を使用すると、この動作は得られません。
スタイルは、初めて使用する前にのみ変更できます。 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));