2016-07-01 4 views
0

У меня есть SolidColorBrush ресурс в App.xaml так:Изменение SolidColorBrush # Цвет в словаре ресурсов не удалось: Свойство только для чтения,

<SolidColorBrush Color="#73AF00" x:Key="BaseGreen"></SolidColorBrush> 

Все мои стили (кнопки, сетки Backgroun цвет, и т.д., и т.д.) содержит этот ресурс, и я хочу, чтобы, когда пользователь менял настройки цвета, весь цвет приложения изменился на синий.

var color = System.Windows.Application.Current.Resources["BaseGreen"] as SolidColorBrush; 
       color.Color = Color.FromRgb(41, 128, 185); 

I try what this answer suggest, но когда я присвоить значение, исключение составляет бросить:

This property is set to read only and cannot be set 

Я тоже попробовать, но ничего не happended:

var color = this.TryFindResource("BaseGreen") as SolidColorBrush; 
color = new SolidColorBrush(Color.FromRgb(41, 128, 185)); 

Есть ли что-то, что мне не хватает?

+1

Этого следовало бы ожидать. Вы должны обменивать ресурсы, а не свойства. Быть, что обменные ресурсные словари или другие ресурсы в одном и том же. Есть много замечательных статей по динамическим темам, в которых люди потратили много времени, и это будет объясняться более подробно. –

ответ

0

Если вы хотите динамически устанавливать цвет для вашего SolidColorBrush в App.xaml, то вы не должны устанавливать значение цвета:

<Application.Resources> 
    <SolidColorBrush x:Key="DynamicColor" /> 
</Application.Resources> 

И в вашем управления, вы должны связать через DynamicResource:

<Label Name="MyLabel" 
      Content="Hello" 
      Background="{DynamicResource Color}" /> 

    <Button Content="Change color" 
      Width="100" 
      Height="30" 
      Click="Button_Click" /> 
</Grid> 

После этого изменить Resource вы должны:

Application.Current.Resources["YourResource"] = YourNewValue; 

Позвольте мне показать пример:

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

    // Set the value 
    Application.Current.Resources["DynamicColor"] = YourBrush;   
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    SolidColorBrush YourBrush = Brushes.Orange; 

    // Set the value 
    Application.Current.Resources["DynamicColor"] = YourBrush; 
} 

DynamicResources используются для изменения. Куда поменять - это желание разработчика.