2014-11-24 5 views
16

У меня есть несколько стилей в моем 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}. Есть лучший способ сделать это?

ответ

19

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

Я попытался использовать DynamicResource, но он говорит: «Имя« DynamicResource »не существует в пространстве имен« http://schemas.microsoft.com/client/2007 ». " –

+0

@ArnVanhoutte: См. Редактирование. Помогает ли это? Любая информация в панели «Вывод» в Visual Studio при запуске проекта? –

+0

Я попытался использовать метод в вашем редактировании, но это не сработало. Он не может разрешить FindResource –

7

Почему вы изменения стиля вместо установки Background -свойстве вашей целевой StackPanel напрямую? Так как «Местное значение» имеет более высокий приоритет, чем «Style сеттера» значение, которое вы пишете в Background из кода позади будет использоваться

Средств:

(1) Дайте имя вашего StackPanel 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

+1

Потому что у меня много стековых панелей в разных моих взглядах. Поэтому вместо того, чтобы изменять их все, я могу просто назначить те, которые я хочу изменить, в конкретный стиль, а затем изменить этот стиль. –

0

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

<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 вместо привязки, как я сказал, что это предложение и Я его не тестировал. Это даст вам привязку для фона и резервное значение для панели стека, для которой вы не задали цвет фона.Дайте мне знать, как это работает для вас :)