WPF StaticResource工作,DynamicResource不工作

Sid*_*ite 9 wpf xaml themes componentresourcekey dynamicresource

我一直在尝试一天,无济于事,在主题中创建一堆画笔,然后在自定义控件中使用DynamicResource.我做的是这样的:

  • 创建包含样式(作品)的主题generic.xaml
  • 添加字典以在generic.xaml中合并以包含应用程序中使用的画笔(作品)
  • make brush具有ComponentResourceKey键(有效)
  • 使用画笔作为静态资源(作品)
  • 使控制使用画笔作为动态资源(不要工作,资源跟踪源说同样多:System.Windows.ResourceDictionary警告:9:找不到资源;)
  • 使用相同的键动态地在App.Resources中添加一个画笔(与动态资源一起使用,它会改变颜色,不能像预期的那样使用静态资源)

所以我的问题是我找不到任何方法来定义主题中的默认值,以便我可以在应用程序中以编程方式更改它们.StaticResource怎么能找到画笔和DynamicResource呢?!

我必须补充一点,我已经创建了一个静态类,将组件资源键作为属性保存在xaml中,例如{x:Static UI:ResourceScheme.ControlBackgroundKey}.我的问题似乎与此类似:ComponentResourceKey作为DynamicResource问题,如果我将静态属性键替换为组件资源键的XAML标记,它仍然不起作用.

有人可以帮帮我吗?:(

Aka*_*ava 5

区别就在这里

StaticResource 在加载时加载,这意味着您正在使用的资源键必须在使用前进行词法定义。

因此,自定义控件中的静态资源必须仅在同一 generic.xaml 文件中的控件定义上方定义。所以如果你把你的画笔放在不同的 xaml 中,它肯定不会在静态资源的情况下工作。

这就是原因,除非在同一文件中编译时以某种导入的形式包含 xaml 类型的其他资源,否则您不能在文件中使用静态资源。它只是意味着文件/组件/控件的实际 xaml 应该包含您使用的静态资源的实际引用。

现在我怀疑为什么 DynamicResource 不起作用,那是因为 DynamicResource 可能只会查看应用程序的(使用控件的地方)ResourceDictionary 而不是 generic.xaml。

我不是 100% 确定,但我觉得如果你定义一个自定义控件并且如果你使用 DynamicResource 那么你的资源必须在应用程序的资源字典或你的控件资源字典的父容器中,但它不能在 generic.xaml 中.

因为 DynamicResource 只会在控制运行时的逻辑树中查找键,这就是为什么它可能找不到 generic.xaml 中的资源,除非在 Application.Resources 中显式添加 generic.xaml。

总结: StaticResource在编译时在同一个文件中必须在词法上可用,资源将在Application.Resources字典中可用,它仍然可以在逻辑树中找到但在编译时只能在同一个dll或同一个generic.xaml中。

DynamicResource 必须在运行时在 Application.Resources 和控件的逻辑树中搜索。

如需更多参考,请查看资源概览


Sid*_*ite 5

最后修好了.看来,在另一个程序集中使用组件资源键的类型会导致整个问题.让我总结一下:

  • 有一个资源类将ComponentResourceKeys保存为静态属性.资源键的构造函数中使用的类型是此类的类型.这是在Resources程序集中.
  • 在另一个程序集中有一个自定义控件的主题,即控件程序集,它定义了一些使用资源类属性作为键的画笔:{x:静态命名空间:ResourceClass.ResourceKeyProperty}
  • 在同一主题中,控件模板使用画笔作为动态资源:{DynamicResource {x:Static Namespace:ResourceClass.ResourceKeyProperty}}
  • 还有一个应用程序使用这些控件,并在应用程序资源中动态添加自定义画笔.这些画笔具有与主题中相同的键.

最终结果是:

  • 控件最初不使用画笔
  • 控件确实使用应用程序资源中添加的画笔
  • 如果在主题中使用StaticResource,则控件最初使用画笔,但随后将忽略应用程序资源

解决方案似乎是移动控件库中的资源类.

由于我仍然不知道为什么会发生这种情况,这个问题仍然存在,即使稍有改变:为什么它在第一种情况下不起作用?