web-dev-qa-db-ja.com

コードで静的リソースを設定する

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}と関係があると思います。これを行うためのより良い方法はありますか?

17
Arn Vanhoutte

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;
    }
}
20
Patrick Hofman

ターゲットBackgroundStackPanel- Propertyを直接設定するのではなく、なぜスタイルを変更するのですか? 「ローカル値」は「スタイルセッター」よりも優先度が高いため、コードビハインドからBackgroundに書き込む値が使用されます。

手段:

(1)スタックパネルに名前を付けますx:Name="spBla"

(2)BackgroundspBlaにブラシを割り当てます(spBla.Background=Application.Current.Resources["styleRed"] as SolidColorBrush;

値の優先順位の詳細については、こちらをご覧ください。

http://msdn.Microsoft.com/en-us/library/ms743230(v = vs.110).aspx

9
Benj

私が正しく理解していれば、特定のスタックパネルのみを変更できるスタイルを設定したいので、すべてを設定する必要はありません。この提案を試してみてください(注:これは提案であり、私はテストしていませんが、うまくいけば正しい方向です)

<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のフォールバック値が得られます。これがあなたのためにどのようにまたは機能するか教えてください:)

0
trippedOverXaml