资源字典合并到Window,如下面的代码所示。
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="DefaultTheme.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
我为上下文菜单创建了一个自定义控件,并在DefaultTheme.xaml文件中创建了相应的样式。即使在窗口级别它合并了资源字典,自定义控件也无法访问这些样式。
由于它是自定义控件,我必须在C#构造函数中合并字典,如下所示 -
const string defaultThemePath = "DefaultTheme.xaml";
var dictionary = new ResourceDictionary { Source = new Uri(defaultThemePath, UriKind.Relative) };
Resources.MergedDictionaries.Add(dictionary);
如果资源字典已合并,那么它应该可用于子控件是一种期望。我对合并资源字典的理解是错误的吗?
修改
正如@Rohit Vats正确指出的那样,我的自定义控件是上下文菜单,它不是窗口的可视子项的一部分。因此它没有继承资源字典。
答案 0 :(得分:1)
我只需将一个SolidColorBrush
放在随机的ResourceDictionary中快速检查,然后将其合并到App资源下,并使用ContextMenu中的资源,ContextMenu就可以访问该资源。
从MSDN开始,StaticResource查找行为的工作方式如下:
查找过程检查资源中请求的密钥 由设置属性的元素定义的字典。
然后,查找过程将逻辑树向上遍历到 父元素及其资源字典。这一直持续到 到达了根元素。
- 醇>
接下来,检查应用程序资源。应用资源是 资源字典中由...定义的那些资源 WPF应用程序的应用程序对象。
从上面的断言可以看出,它寻找逻辑父而不是Visual父,如果在任何地方找不到资源,它会在App资源下查找资源。
因此,如果您合并App资源下的资源,那么ContextMenu的情况将会起作用。