为什么Generic.xaml中的合并字典需要绝对的uri?

时间:2010-09-16 21:04:22

标签: wpf resourcedictionary

考虑一个文件| WPF应用程序的新项目,包含:

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

    从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。如果我在没有pack://应用程序的东西的情况下将上面的内容更改为Source =“Dictionary1.xaml”,那么我会在尝试构造MainWindow时遇到由IOException引起的XamlParseException“找不到资源'dictionary1.xaml'”。 / p>

    我的问题: 关于相对URI解析的generic.xaml有什么特别之处?为什么?

2 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:0)

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