以编程方式从 MergedDictionaries 获取应用 XAML 资源

Programmatically getting app XAML resource from MergedDictionaries

通用Windows 8.1 在此处存储项目。

我需要以编程方式从给定资源名称的应用程序的合并词典中获取资源。

我想出了一个实用方法,可以得到我想要的东西,但对我来说看起来很丑陋:

public static async Task<T> GetAppResource<T>(string key) where T:class
{
  T resource = default(T);
  await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
    CoreDispatcherPriority.Normal,
    ()=>{
      foreach (var d in Application.Current.Resources.MergedDictionaries) {
        foreach (var pair in d) {
          if (pair.Key.ToString() == key && pair.Value is T) {
            resource = pair.Value as T;
            goto End;
          }
        }
      }
      End:;
    }
  );
  return resource;
}

有更好的方法吗?

字典声明如下:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="..." />
            <ResourceDictionary Source="..." />
            ...
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>  

实际上,我正在以编程方式打开合并词典中声明的浮出控件。

通过 MergedDictionaries 属性 添加到 ResourceDictionary 的词典实际上成为添加它们的 ResourceDictionary 的一部分。从 top-level ResourceDictionary 中检索值将涉及在主字典中搜索该值的键,如果找不到,则遍历 MergedDictionaries 来搜索键。

因此,通过 MergedDictionaries 添加的资源几乎可以像 top-level 字典中包含的那样检索。主要区别在于合并字典中允许重复键,如果在 top-level字典.

因此您可以在 top-level 字典上调用 TryGetValue(),使用索引器语法(例如 Application.Current.Resources["someKey"]),甚至使用适当的 FindResource() 调用(即取决于关于上下文是 Application 对象还是 FrameworkElement 对象)。资源将被检索,就好像它在 top-level 字典本身中一样。


我希望以上内容充分阐述了文档。 MSDN 中的文档(例如 Merged Resource Dictionaries)在某种程度上暗示了上述内容,但它们从来没有真正明确地说出来。 :( 该文档更侧重于如何创建合并词典,而不是如何在创建后实际使用它们。