我有一个包含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”来访问它?
在这种情况下,本地程序集是指执行程序集还是代码/资源所属的程序集?
编辑:已更新以反映实际问题。
答案 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
文件不在项目根目录中,请务必正确设置其路径。