Установка статического ресурса в коде

У меня есть несколько стилей в файле 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>

Я хочу изменить BackgroundProperty в коде моего mainpage.xaml.cs.

Я попытался использовать это:

Style style = Application.Current.Resources["stackpanelBackground"] as Style;          
style.Setters.SetValue(StackPanel.BackgroundProperty, "{StaticResource styleRed}");

Но я получаю исключение катастрофической ошибки. Я думаю, что это связано с {StaticResource styleRed}. Есть ли лучший способ сделать это?

Ответы

Ответ 1

A StaticResource является статическим. Вы не можете изменить их после компиляции приложения.

Для этой цели существует DynamicResource:

A 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;
    }
}

Ответ 2

Почему вы изменяете стиль вместо того, чтобы напрямую настраивать Background -Property вашего целевого StackPanel? Поскольку "Локальное значение" имеет более высокий приоритет, чем "Style seters", значение, которое вы записываете в 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

Ответ 3

Если я правильно понимаю, вы хотите настроить стиль, который позволяет изменять только определенные стековые панели, поэтому вам не нужно устанавливать их все. Попробуйте это предложение (обратите внимание: это предложение, и я его не тестировал, но, надеюсь, он находится в правильном направлении)

<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>

Или попробуйте TemplateBinding вместо привязки, например, я сказал, что это предложение, и я его не тестировал. Это даст вам привязку для фона и резервное значение для панели стека, для которой вы не задали цвет фона. Дайте мне знать, как и если это работает для вас:)