动态加载 ResourceDictionary

4

我在项目中有一个名为Templates的文件夹,里面存放着已编译的XAML ResourceDictionaries。

在UserControl中,我想要将所有模板加载到ResourceDictionary中。我可以使用以下代码:

public MyView()
{
    InitializeComponent();
    foreach (var resourceUri in new GetResourceUrisFromTemplatesFolder())
        Resources.MergedDictionaries.Add(
            new ResourceDictionary
                { Source = new Uri(resourceUri, UriKind.Relative) });
}

我需要写的是 GetResourceUrisFromTemplatesFolder 方法。我需要它来发现该文件夹中的所有资源。
URI 可以采用以下形式:/MyAssembly;component/MyNS/Templates/Template12345.xaml../../Templates/Template12345.xaml 这可行吗?
我是否需要手动转换来自程序集编译资源(MyAssembly.g.resources)的名称?
2个回答

8

顺便提一下,似乎也可以手动加载 ResourceDictionary:

ResourceDictionary dict = new ResourceDictionary(); 
System.Windows.Application.LoadComponent(dict, 
  new System.Uri("/SomeAssembly;component/SomeResourceDictionary.xaml",
  System.UriKind.Relative));

在那之后,可以使用Keys属性上的foreach访问该字典对象等。在http://msdn.microsoft.com/en-us/library/ms596995(v=vs.95).aspx中提到:
加载的XAML文件可以是应用程序定义文件(例如App.xaml)或页面文件(例如MainPage.xaml)。XAML文件可以处于以下位置之一:
- 包括在应用程序包中。 - 嵌入在应用程序集中。 - 嵌入在源站点的库程序集中。

这似乎与使用“源”加载字典没有什么不同。 “复杂”的部分不是加载字典,而是生成Uri。 - Diego Mijelshon

1
我需要手动从程序集编译后的资源 (MyAssembly.g.resources) 中转换名称吗?
这可能是必须的,而我本人会采用这种方式,但是如何做到这一点的问题 已经得到解答,因此应该不是太大的问题。确保字典的编译操作匹配,并且您可能想使用打包URI前缀来命名。

是的,结果证明这很容易。 - Diego Mijelshon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接