C# 以编程方式从合并词典获取应用程序XAML资源

C# 以编程方式从合并词典获取应用程序XAML资源,c#,xaml,windows-8.1,winrt-xaml,windows-8.1-universal,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.Dispatch

此处是通用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;
}
公共静态异步任务GetAppResource(字符串键),其中T:class
{
T资源=默认值(T);
等待CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority,正常,
()=>{
foreach(Application.Current.Resources.MergedDictionaries中的vard){
foreach(d中的var对){
if(pair.Key.ToString()==Key&&pair.Value为T){
资源=配对。值为T;
转到终点;
}
}
}
完:;
}
);
返回资源;
}
有更好的方法吗

词典声明如下:

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

...

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

通过
MergedDictionaries
属性添加到
ResourceDictionary
的词典实际上成为它们添加到的
ResourceDictionary
的一部分。从顶级
ResourceDictionary
检索值需要在主字典中搜索值的键,如果找不到,则遍历
合并字典
以搜索键

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

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



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

“更好”如何声明?不清楚您是如何声明词典的,也不清楚您为什么要直接访问
MergedDictionaries
。通常,您只需像往常一样按键检索值,然后让
ResourceDictionary
对象根据需要将查找延迟到合并词典。即,只需调用
TryGetValue()
,或使用索引器语法。请提供一个好的示例,清楚地说明您正在做什么,以及为什么按键检索值的常用机制不适用于您。无论如何,谢谢您,您理解了我,并且您回答了我的问题,尽管很简单。由于某种原因,我昨天没有想到,我需要做的只是
>Application.Current.Resources.TryGetValue()
。可能会出现错误。:)我可以删除该问题,或者您可以将“通常”后面的两句话放在答案中,我接受它。因为目前似乎还没有类似的问题,而且在我看来,文档在这一点上实际上不太清楚,我将继续并发布一个答案。