首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式从MergedDictionaries获取app XAML资源

以编程方式从MergedDictionaries获取app XAML资源
EN

Stack Overflow用户
提问于 2016-01-14 08:56:38
回答 1查看 2.2K关注 0票数 2

通用Windows 8.1商店项目在这里。

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

我想出了一种实用的方法,让我得到了我想要的东西,但在我看来却很难看:

代码语言:javascript
复制
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;
}

有更好的方法吗?

字典声明如下:

代码语言:javascript
复制
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="..." />
            <ResourceDictionary Source="..." />
            ...
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>  

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-15 19:18:21

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

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

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

我希望上述文件对文件有充分的阐述。MSDN中的文档(例如合并资源词典 )在某种程度上暗示了上述内容,但它们从来没有真正明确地说过这一点。(文档更多地关注如何创建合并的字典,而不是在创建之后如何实际使用它们。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34785247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档