【问题标题】:Why are absolute uri's required for merged dictionaries in Generic.xaml?为什么 Generic.xaml 中的合并字典需要绝对 uri?
【发布时间】:2010-09-16 21:04:22
【问题描述】:

考虑一个文件 |包含以下内容的 WPF 应用程序的新项目:

  1. 名为 CustomControl1 的新自定义控件
  2. 两个名为 Dictionary1 和 Dictionary2 的新资源字典

从 Generic.xaml 中取出生成的样式并将其移至 Dictionary2。然后将 Dictionary2 合并到 Dictionary1 中,将 Dictionary1 合并到 Generic 中,如下所示:

<!--Generic.xaml-->
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/Themes/Dictionary1.xaml"/>
</ResourceDictionary.MergedDictionaries>

<!--Dictionary1.xaml-->
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Dictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>

然后,将 CustomControl1 的一个实例添加到 MainWindow 的网格中。 (这部分是重现问题所必需的。项目始终编译良好 - 只有在运行时才会出现问题,并且必须引用字典。)

在 Dictionary1.xaml 中,我将合并到同一文件夹中的另一个 dict 中,因此一个简单的 Source="Dictionary2.xaml" 可以工作。然而在 Generic.xaml 中,我必须使用绝对 URI。如果我将上面的内容更改为 Source="Dictionary1.xaml" 而没有 pack://application 的东西,那么当它尝试构造 MainWindow 时,我会得到一个由 IOException "Cannot locate resource 'dictionary1.xaml'" 引起的 XamlParseException。

我的问题: generic.xaml 在相对 URI 解析方面有什么特别之处,为什么?

【问题讨论】:

    标签: wpf resourcedictionary


    【解决方案1】:

    对不起,因为我没有能力编写 cmets,所以我将其发布为答案。

    我有同样的情况,一切对我来说都很好。我不需要将“pack://application”放在 Generic.xaml 的路径中。但仅当程序集的输出类型为“Windows 应用程序”时。 对于“类库”,我需要将程序集名称添加到路径 (Source="/ClassLibarayAssemblyName;component/Themes/Dictionary1.xaml") 因为没有它 WPF 引擎会尝试在应用程序的主程序集中查找 Dictionary1.xaml。

    这两种情况下的目标框架都是“.NET Framework 4 Client Profile”

    【讨论】:

      【解决方案2】:

      只是一个猜测:generic.xaml 也需要可以从外部程序集访问,因此这是一种确保可以使用绝对 URI 从任何地方找到资源的方法。正如我所说,这只是在黑暗中刺伤,不确定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-24
        相关资源
        最近更新 更多