2

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

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

4

1 回答 1

3

ResourceDictionary通过属性添加到 a 的字典MergedDictionaries有效地成为ResourceDictionary添加它们的一部分。从顶层检索一个值ResourceDictionary将涉及在主字典中搜索该值的键,如果没有找到,则遍历MergedDictionaries搜索键。

因此,通过添加的资源MergedDictionaries几乎可以被检索到,就好像它们只是包含在顶级字典中一样。主要区别在于合并字典中允许重复键,如果在顶级字典中找不到,则从找到它的最后一个合并字典中检索给定键的值。

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


我希望以上内容对文档进行了充分阐述。MSDN 中的文档(例如Merged Resource Dictionaries )在一定程度上暗示了上述内容,但它们从未真正明确地说出来。:( 文档更多地关注如何创建合并字典,而不是如何在创建后实际使用它们。

于 2016-01-15T19:18:21.580 回答