【问题标题】:In WPF, how to reference a StaticResource in App.xaml from merged dictionary在 WPF 中,如何从合并字典中引用 App.xaml 中的 StaticResource
【发布时间】:2017-11-12 03:29:08
【问题描述】:

这似乎是一个老问题:为什么我不能从合并字典中引用 App.xaml 中的 StaticResource?这是我的代码:

App.xaml:

<Application x:Class="WpfResources.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <Color x:Key="MyColor">GreenYellow</Color>

            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary1.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

    </Application.Resources>
</Application>

Dictionary1.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <SolidColorBrush x:Key="Button.Static.Foreground" Color="{StaticResource MyColor}"/>

    <Style TargetType="{x:Type Button}">
        <Setter Property="Foreground"
            Value="{StaticResource Button.Static.Foreground}"/>
    </Style>
</ResourceDictionary>

在设计时,一切都很好,我可以看到按钮的前景设置为 MyColor。但在运行时,我得到了:

异常:找不到名为“MyColor”的资源。资源名称区分大小写。

顺便说一句:这些代码在 UWP 中工作,但在 WPF 中,似乎发生了一些变化。我在网上做了很多搜索,但找不到答案。

任何想法将不胜感激!谢谢!

(顺便说一句:我不想更改为 DynamicResource 解决方案)

编辑: 为什么有人给我降级?有什么好的理由吗? 虽然这是一个'老'问题,但根据我的搜索,它仍然没有正确的答案!

【问题讨论】:

    标签: c# wpf xaml uwp


    【解决方案1】:

    原因似乎是 xaml 解析器构造您的应用程序的顺序。首先它填充MergedDictionaries。要做到这一点 - 它需要构造Dictionary1.xaml,此时它失败了,因为还没有键为MyColor 的资源。为了验证这一点,您可以在代码中按照正确的顺序自己填写资源:

    this.Resources = new ResourceDictionary();
    this.Resources.Add("MyColor", Colors.GreenYellow);
    this.Resources.MergedDictionaries.Add(new ResourceDictionary() {Source = new Uri("Dictionary1.xaml", UriKind.Relative)});
    

    现在它可以正常工作了。

    当然,在代码中这样做不是一种选择(只是为了确认问题的根源)。作为一种解决方法,您可以这样做:

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <Color x:Key="MyColor">GreenYellow</Color>
                </ResourceDictionary>
                <ResourceDictionary Source="Dictionary1.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    

    现在 xaml 解析器将首先将您的字典与资源合并,然后是所有其他字典,因此 MyColor 将可供所有人使用。

    【讨论】:

    • 这就是我想要的答案!我希望我早点看到这个答案!非常感谢,先生,您救了我的命!
    【解决方案2】:

    1. 可能声明的优先级错误

    可能有用:can-merged-resource-dictionaries-access-resources-from-app-xaml


    2。另一种方式

    我认为这是在页面中定义颜色的好方法:

    <SolidColorBrush x:Key="MyColor" Color="#fff"/>
    

    然后将按钮前景绑定到那些页面颜色资源:

    <Button Foreground="{DynamicResource MyColor}"/>
    

    资源字典中,将您需要的每个属性绑定到:

    <Setter Property="Property" Value="{TemplateBinding Foreground}"/>
    

    【讨论】:

    • 谢谢!但我相信解决方案 1 只适用于 UWP(虽然我没有测试过)。至于2,我不想使用动态资源。我的 App.xaml 中有很多样式,我想将它们移到单独的资源字典中,所以我真的想让我的方法工作。
    • 事实上,根据 Evk 的回答,我将“MyColor”移动到另一个资源字典并将其合并到 App.xaml(在 Dictionary1.xaml 之前)中,然后一切正常。这就像解决方案 1,但您没有提及它的工作原理和方式,因此我无法将此答案标记为已接受。对不起!不过谢谢!
    猜你喜欢
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多