2014-01-21 2 views
4

Как изменить цвет в словаре ресурсов, который используется в другом словаре ресурсов во время выполнения?Как изменить цвет ресурса SolidColorBrush во время выполнения?

Вот мои настройки:

Colours.xaml:

<SolidColorBrush x:Key="themeColour" Color="#16A8EC"/> 

Styles.xaml:

<Style x:Key="titleBar" TargetType="Grid"> 
    <Setter Property="Background" Value="{DynamicResource themeColour}"/> 
</Style> 

Window.xaml

..... 
<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="res/Styles.xaml"/> 
    <ResourceDictionary Source="res/Colours.xaml"/> 
</ResourceDictionary.MergedDictionaries> 
..... 

<Grid Style="{DynamicResource titleBar}"></Grid> 

код позади:

Application.Current.Resources["themeColour"] = new SolidColorBrush(newColour); 

Когда код запускается цвет сетки не меняется. Я не думаю, что Application.Current.Resources ["themeColour"] ссылается на мой ресурс solidcolorbrush, как если бы, если я попытаюсь получить к нему доступ, прежде чем назначать ему новый цвет, я получаю исключение ссылки на нулевой объект.

Итак, как мне получить доступ к ресурсу «themeColour»?

ответ

5

Для того, чтобы ваш код работать, ResourceDictionary должен быть в файле App.xaml где ResourceDictionary должно быть:

App.xaml

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Dictionary/StyleDictionary.xaml"/> 
      <ResourceDictionary Source="Dictionary/ColorDictionary.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources>   

Code-behind

private void Window_ContentRendered(object sender, EventArgs e) 
{ 
    SolidColorBrush MyBrush = Brushes.Black; 

    Application.Current.Resources["themeColour"] = MyBrush; 
} 

Почему лучше использовать App.xaml

  • правильно все стили и словари ресурсов, хранящиеся в этом файле, потому что он был создан специально для этого - все ресурсы приложения были доступны из одного места. Это также может повлиять на производительность приложения.

  • были случаи, когда StaticResource была использована успешно, но не DynamicResource (ресурсы помещаются в Window.Resources). Но после перемещения ресурса в App.xaml все приступило к работе.

+0

Работал отлично, спасибо! Мне показалось немного странным, что я должен был объявлять ресурсы в каждом отдельном окне ... добавление их в app.xaml намного удобнее. – mbdavis

4

Это потому, что ваши ресурсы доступны в Window, а не в Application. Попробуйте это в Window.xaml.cs:

this.Resources["themeColour"] = new SolidColorBrush(newColour); 
+1

Спасибо! Я закончил делать, как сказал Анатолий, хотя – mbdavis

Смежные вопросы