通用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> 实际上,我正在以编程的方式打开合并字典中声明的flyouts。
发布于 2016-01-15 19:18:21
通过ResourceDictionary属性添加到MergedDictionaries中的字典实际上成为添加到其中的ResourceDictionary的一部分。从顶级ResourceDictionary检索值将涉及在主字典中搜索值的键,如果找不到,则遍历MergedDictionaries以搜索键。
因此,通过MergedDictionaries添加的资源几乎可以被检索,就好像它们只是包含在顶级字典中一样。主要区别在于合并字典中允许重复键,如果在顶级字典中找不到,则从上一次合并字典中检索给定键的值。
因此,您可以在顶级字典上调用TryGetValue(),使用索引器语法(例如Application.Current.Resources["someKey"]),甚至可以使用适当的FindResource()调用(即取决于上下文是Application对象还是FrameworkElement对象)。资源将被检索,就像它在顶级字典本身中一样。
我希望上述文件对文件有充分的阐述。MSDN中的文档(例如合并资源词典 )在某种程度上暗示了上述内容,但它们从来没有真正明确地说过这一点。(文档更多地关注如何创建合并的字典,而不是在创建之后如何实际使用它们。
https://stackoverflow.com/questions/34785247
复制相似问题