没有好的最小、完整且可验证的代码示例 https://stackoverflow.com/help/mcve可靠地重现您的问题,但不可能确定问题是什么。但基本问题似乎是你正在尝试使用DynamicResource
以不受支持的方式。
From 文档 https://learn.microsoft.com/en-us/dotnet/framework/wpf/advanced/xaml-resources:
动态资源引用有一些显着的限制。至少必须满足以下条件之一:
•要设置的属性必须是FrameworkElement 或FrameworkContentElement 上的属性。该属性必须由 DependencyProperty 支持。
•该引用针对StyleSetter 中的值。
•要设置的属性必须是 Freezable 上的属性,该属性作为 FrameworkElement 或 FrameworkContentElement 属性的值或 Setter 值提供。
由于要设置的属性必须是 DependencyProperty 或 Freezable 属性,因此大多数属性更改都可以传播到 UI,因为属性更改(更改后的动态资源值)会被属性系统确认。大多数控件都包含逻辑,如果 DependencyProperty 发生更改并且该属性可能会影响布局,则该逻辑将强制控件采用另一种布局。然而,并非所有具有 DynamicResource 标记扩展作为其值的属性都保证以在 UI 中实时更新的方式提供值 [强调我的]。该功能仍然可能会根据属性、拥有该属性的类型甚至应用程序的逻辑结构而有所不同。
您正在设置属性SolidColorBrush
对象,即not a FrameworkElement
or FrameworkContentElement
。场景does尽管满足文档中的第三个要点(SolidColorBrush
is a Freezable
, 然后Freezable
被提供为 a 的值FrameworkElement
)。但请注意我用粗体显示的文字。即使满足这些要求,也不能保证它会起作用。
有趣的是,您似乎正在尝试实施的基本方法does工作,当在一个环境中完成时ResourceDictionary
直接拥有者FrameworkElement
(e.g. Window
).
为什么会这样,我不知道。我的猜测是,只要你处于FrameworkElement
某处,有足够的内部状态管理来处理更新DynamicResource
代理,因此它可以正常工作。
无论如何,这意味着一种可能的解决方法是将您的资源投入Window.Resources
而不是你现在把它们放在任何地方。我不知道你是否可以信赖这个always在职的;毕竟,该文档包罗万象,让微软可以说“也许它会起作用,也许不会”。但在我看来,这种情况可能不会很快被打破。
或者,您可以修改画笔资源本身。例如。:
private void Button1_Click(object sender, RoutedEventArgs e)
{
Application.Current.Resources["ForegroundBrush"] = new SolidColorBrush(Colors.Green);
}
That does遵守文档中的更多要求,因此似乎更有可能适用于 .NET 的任何未来版本(我已经验证它今天确实有效????)。