【发布时间】:2022-01-11 13:38:23
【问题描述】:
有什么方法可以使用反射访问 Themes/Generic ResourceDictionary?
我尝试挖掘 Application.Resources 但这似乎是错误的地方。
然后我尝试分析 Assembly 的 ResourceStream,但也没有成功。
那么有谁知道我如何从程序集中获取提到的ResourceDictionary 的实例?
在有人问“为什么”之前 => 因为我想搞砸它。
这是我得到的最接近的,但它会引发无法加载某些部分的错误,所以我假设它是“副本”而不是使用的那个?
System.Uri resourceLocater = new System.Uri("/ASMNAME;component/themes/generic.xaml", System.UriKind.Relative);
ResourceDictionary dictionary =(ResourceDictionary) Application.LoadComponent(resourceLocater);
【问题讨论】:
-
伙计,我的回答返回了实际的 ResourceDictionary - 与 FindResource 一样!它最初是编译到 DLL 中的!这是二进制数据!您必须阅读 ite 并将其转换为 XAML!然后你可以解析这个 XAML 并创建一个 ResourceDictionary 的实例!这就是它的工作原理。这与 WPF 框架所做的和 FindResource 所做的相同!
-
它使用 relection 返回 generic.xaml 的 ResourceDitionary。请参阅这行代码:
var genericXamlResources = System.Windows.Markup.XamlReader.Load(themesBamlReader) as ResourceDictionary;- 在我提取样式之前作为示例。 -
@BionicCode 不完全。 FrameWork 使用它的缓存实例,这是我在答案中发布的方式。添加新样式不适用于您的独奏,因为它基本上是一个副本,而不是使用的那个。看看这些方法做了什么,他们在幕后使用字典。我删除了我的反对票,因为你删除了你所有的个人 cmets
标签: c# wpf reflection