Windows的合并资源字典不反映子控件

时间:2014-03-14 10:20:07

标签: c# wpf hierarchy resourcedictionary

资源字典合并到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正确指出的那样,我的自定义控件是上下文菜单,它不是窗口的可视子项的一部分。因此它没有继承资源字典。

1 个答案:

答案 0 :(得分:1)

我只需将一个SolidColorBrush放在随机的ResourceDictionary中快速检查,然后将其合并到App资源下,并使用ContextMenu中的资源,ContextMenu就可以访问该资源。

MSDN开始,StaticResource查找行为的工作方式如下:

  
      
  1. 查找过程检查资源中请求的密钥   由设置属性的元素定义的字典。

  2.   
  3. 然后,查找过程将逻辑树向上遍历到   父元素及其资源字典。这一直持续到   到达了根元素。

  4.   
  5. 接下来,检查应用程序资源。应用资源是   资源字典中由...定义的那些资源   WPF应用程序的应用程序对象。

  6.   

从上面的断言可以看出,它寻找逻辑父而不是Visual父,如果在任何地方找不到资源,它会在App资源下查找资源。

因此,如果您合并App资源下的资源,那么ContextMenu的情况将会起作用。