App.xaml
ファイルにいくつかのスタイルがあります:
<SolidColorBrush x:Key="styleBlue" Color="#FF4B77BE"/>
<SolidColorBrush x:Key="styleRed" Color="#FFF64747"/>
<SolidColorBrush x:Key="styleOrange" Color="#FFF89406"/>
<SolidColorBrush x:Key="styleGreen" Color="#FF1BBC9B"/>
<SolidColorBrush x:Key="styleYellow" Color="#FFF9BF3B"/>
<Style x:Key="stackpanelBackground" TargetType="StackPanel">
<Setter Property="Background" Value="{StaticResource styleBlue}"/>
</Style>
mainpage.xaml.cs
のコードのBackgroundProperty
を変更したい。
私はこれを使ってみました:
Style style = Application.Current.Resources["stackpanelBackground"] as Style;
style.Setters.SetValue(StackPanel.BackgroundProperty, "{StaticResource styleRed}");
しかし、壊滅的な障害の例外が発生します。 {StaticResource styleRed}
と関係があると思います。これを行うためのより良い方法はありますか?
StaticResource
は静的です。アプリケーションがコンパイルされると、それらを変更することはできません。
この目的のために、 DynamicResource
があります。
DynamicResourceは、初期コンパイル中に一時式を作成し、したがって、オブジェクトを構築するために要求されたリソース値が実際に必要になるまでリソースの検索を延期します。
また、 FindResource
を使用すると、他のリソースへの参照を見つけやすくなることに注意してください。次のようなものを試してください(完全な動作サンプル):
MainPage.xaml
:
<Window.Resources>
<Color R="255" x:Key="styleRed" />
<Style x:Key="abc" TargetType="StackPanel">
<Setter Property="Background" Value="Blue" />
</Style>
</Window.Resources>
MainPage.xaml.cs
:
Style style = this.FindResource("abc") as Style;
var r = this.FindResource("styleRed");
foreach (Setter s in style.Setters)
{
if (s.Property == StackPanel.BackgroundProperty)
{
s.Value = r;
}
}
ターゲットBackground
のStackPanel
- Propertyを直接設定するのではなく、なぜスタイルを変更するのですか? 「ローカル値」は「スタイルセッター」よりも優先度が高いため、コードビハインドからBackground
に書き込む値が使用されます。
手段:
(1)スタックパネルに名前を付けますx:Name="spBla"
(2)Background
のspBla
にブラシを割り当てます(spBla.Background=Application.Current.Resources["styleRed"] as SolidColorBrush;
)
値の優先順位の詳細については、こちらをご覧ください。
http://msdn.Microsoft.com/en-us/library/ms743230(v = vs.110).aspx
私が正しく理解していれば、特定のスタックパネルのみを変更できるスタイルを設定したいので、すべてを設定する必要はありません。この提案を試してみてください(注:これは提案であり、私はテストしていませんが、うまくいけば正しい方向です)
<SolidColorBrush x:Key="styleBlue" Color="#FF4B77BE"/>
<SolidColorBrush x:Key="styleRed" Color="#FFF64747"/>
<SolidColorBrush x:Key="styleOrange" Color="#FFF89406"/>
<SolidColorBrush x:Key="styleGreen" Color="#FF1BBC9B"/>
<SolidColorBrush x:Key="styleYellow" Color="#FFF9BF3B"/>
<Style x:Key="stackpanelBackground" TargetType="StackPanel">
<Setter Property="Background" Value="{Binding Background, FallbackValue={StaticResource styleBlue}}"/>
</Style>
または、提案ではなく、テストしていないように、BindingではなくTemplateBindingを試してください。これにより、背景のバインディングと、背景色を設定していないstackpanelのフォールバック値が得られます。これがあなたのためにどのようにまたは機能するか教えてください:)