在设置ResourceDictionary.Source时,从代码创建WPF ResourceDictionary似乎不起作用

时间:2010-10-29 07:55:19

标签: wpf unity-container prism resourcedictionary

我有一个包含xaml ResourceDictionary的项目,我希望在FrameworkElement之外使用它。资源字典将包含项目本地类的DataTemplate,以避免污染app.xaml(因为项目是一个prism模块,并且根据配置不会总是存在)。

所以,我有一个带有资源构建操作的test.xaml文件。

这是为了为TestObject类提供DataTemplate。

在TestObject类中,我有一个GetTemplate()方法

以下作品:

DataTemplate GetTemplate()
{
    Uri uri = new Uri("MyProject;component/test.xaml", UriKind.Relative);

    var dict = new ResourceDictionary { Source = uri};

    return (DataTemplate)dict["TestObjectDataTemplate"];
}

当我将uri分配给ResourceDictionary.Source属性

时抛出异常
DataTemplate GetTemplate()
{
    Uri uri = new Uri("/test.xaml", UriKind.Relative);

    var dict = new ResourceDictionary { Source = uri};

    return (DataTemplate)dict["TestObjectDataTemplate"];
}

第二个示例失败,因为在本地程序集中找不到/test.xaml。为什么我需要使用“ReferencedAssembly; component / test.xaml”来访问它?

在这种情况下,本地程序集是指执行程序集还是代码/资源所属的程序集?

编辑:已更新以反映实际问题。

2 个答案:

答案 0 :(得分:2)

尝试UriKind.RelativeOrAbsolute

更清楚地说。

    DataTemplate GetTemplate()
    {           
        ResourceDictionary resource = new ResourceDictionary()
        {
            Source = new Uri(@"/AssemblyFullName;component/test.xaml", UriKind.RelativeOrAbsolute)
        };

        return (DataTemplate)resource["TestObjectDataTemplate"];
    }

修改

  

在这种情况下,是否进行本地组装   意思是执行组件或   汇编代码/资源是?

的一部分

比如说:
您有两个项目A项目和项目B.

您在项目B中使用项目A作为参考

现在,如果您想使用像/test.xaml这样的资源。然后,此资源应驻留在项目B中。因为它是执行程序集。 [它既可用于项目A,也可用于项目B.您可以使用上述语法。比如/test.xaml]

如果您希望在项目A中定义和使用资源。那么,您应该使用"/ProjectA;component/test.xaml",因为它不是当前正在执行的程序集。 [它将同时适用于项目A和项目B.您必须使用"/ProjectA;component/test.xaml"来访问这两个项目]

答案 1 :(得分:1)

设置Source attr有效,我在很多项目中成功使用了它 您的Uri可能有误。你应该尝试一个完全合格的包Uri,比如:

dict.Source = new Uri("pack://application:,,,/test.xaml");

如果您的test.xaml文件不在项目根目录中,请务必正确设置其路径。