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

本文关键字:获取 应用 XAML 资源 编程 方式 合并 | 更新日期: 2023-09-27 18:30:31

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

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

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

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

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

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


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