如何在运行时更改SolidColorBrush资源的颜色?

时间:2014-01-21 16:49:50

标签: c# wpf xaml

如何在运行时更改另一个资源字典中使用的资源字典中的颜色?

这是我的设置:

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

2 个答案:

答案 0 :(得分: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中移动资源后,一切都开始起作用了。

答案 1 :(得分:4)

这是因为您的资源位于Window而不是Application。在Window.xaml.cs中试试这个:

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