代码之家  ›  专栏  ›  技术社区  ›  LukeN

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

  •  1
  • LukeN  · 技术社区  · 14 年前

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

    所以,我有一个test.xaml文件,其中包含一个资源构建操作。

    这旨在为TestObject类提供DataTemplate。

    以下工作:

    DataTemplate GetTemplate()
    {
        Uri uri = new Uri("MyProject;component/test.xaml", UriKind.Relative);
    
        var dict = new ResourceDictionary { Source = uri};
    
        return (DataTemplate)dict["TestObjectDataTemplate"];
    }
    

    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 回复  |  直到 14 年前
        1
  •  2
  •   Prince Ashitaka    14 年前

    尝试 UriKind.RelativeOrAbsolute .

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

    编辑:

    在这个例子中,本地程序集 指执行程序集或 程序集代码/资源是什么的一部分?

    例如:

    您正在使用项目A作为项目B中的引用

    现在,如果你想像这样使用资源 /test.xaml . 然后,该资源应该位于项目B中。因为,它是正在执行的程序集。[它将同时适用于项目A和项目B。您可以使用上述语法。喜欢 /测试.xaml ]

    如果希望在项目A中定义和使用资源,则应使用 "/ProjectA;component/test.xaml" 因为它不是当前正在执行的程序集。[项目A和项目B都可以使用。您必须使用 在两个项目中都可以访问]

        2
  •  1
  •   Aurelien Ribon    14 年前

    设置 Source attr工作了,我成功地在许多项目中使用了它。
    Uri 可能是错的。您应该尝试完全限定的包Uri,例如:

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

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