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

时间:2016-01-14 08:56:39

标签: c# xaml windows-8.1 winrt-xaml windows-8.1-universal

通用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>  

实际上,我是以编程方式打开合并词典中声明的弹出窗口。

1 个答案:

答案 0 :(得分:3)

通过ResourceDictionary属性添加到MergedDictionaries的词典实际上成为了添加它们的ResourceDictionary的一部分。从顶级ResourceDictionary检索值将涉及在主词典中搜索值的键,如果未找到,则遍历MergedDictionaries以搜索密钥。

因此,可以检索通过MergedDictionaries添加的资源,就好像它们只包含在顶级字典中一样。主要区别在于合并字典中允许使用重复键,并且从找到它的 last 合并字典中检索给定键的值,如果未在顶部找到的话级别词典。

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


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