【问题标题】:Merged Resource Dictionaries of Windows does not reflect on child controlsWindows 的合并资源字典不反映子控件
【发布时间】:2014-03-14 10:20:07
【问题描述】:

资源字典合并到窗口中,如下面的代码所示。

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

【问题讨论】:

  • 只要自定义控件是窗口的可视子级,就可以访问它。如果不是这种情况,请在 App 资源下合并字典。
  • 谢谢罗希特。自定义控件是一个上下文菜单。如果我是对的,它不是窗口的可视子项:)...那么我应该如何合并字典,以便即使上下文菜单也可以具有样式...在构造函数中实例化对我来说看起来很脏。
  • 我已为您的查询添加了答案(无法在此处添加,因为它需要更多空间来解释)。

标签: c# wpf hierarchy resourcedictionary


【解决方案1】:

我只是快速检查,将一个 SolidColorBrush 放入随机 ResourceDictionary 并将其合并到 App 资源下并使用 ContextMenu 中的资源,而 ContextMenu 能够访问该资源。

来自MSDN,StaticResource 查找行为如下:

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

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

  3. 接下来,检查应用程序资源。应用资源是 资源字典中由 您的 WPF 应用程序的应用程序对象。

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

因此,如果您合并 App 资源下的资源,您的 ContextMenu 案例将起作用。

【讨论】:

  • 我也不想这样做,即合并到应用程序资源。我将尝试对资源字典使用静态访问器,而不是对名称进行硬编码。接受澄清的答案
  • 为什么不想在App资源下合并?无论如何,您已经将它合并到 Window 资源下。
  • 因为我的更改处于用户控制级别。集成的应用程序尚未完成,它可能会改变资源的加载方式。因此,当应用级别发生变化时,不想为我的模块创建依赖项。
  • 同一个字典多次合并好不好?一次在用户控制级别,一次在窗口/应用级别?
  • 是的,你可以合并它。在许多情况下这是有效的场景,例如您想在不同的 RD 中使用资源,因为您必须单独合并。
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多