【问题标题】:How to change a SolidColorBrush resource's colour at runtime?如何在运行时更改 SolidColorBrush 资源的颜色?
【发布时间】:2014-01-22 01:20:01
【问题描述】:

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

这是我的设置:

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

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    为了使您的代码正常工作,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 之后,一切都开始工作了。

    【讨论】:

    • 完美运行,谢谢!我必须在每个窗口中声明资源似乎有点奇怪……将它们放在 app.xaml 中要方便得多。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢!我最终还是按照 Anatoily 说的做了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多