1

我有一个项目,其中包含我希望在 FrameworkElement 之外使用的 xaml ResourceDictionary。资源字典将包含项目本地类的 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" 访问它?

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

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

4

2 回答 2

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"它在两个项目中访问]

于 2010-10-29T09:03:03.337 回答
1

设置Sourceattr 工作,我在许多项目中成功使用它。
你的Uri可能是错的。您应该尝试一个完全合格的包 Uri,例如:

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

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

于 2010-10-29T09:09:24.193 回答