gpt4 book ai didi

c# - 如何使用 DynamicResource 更新 SolidColorBrush 颜色?

转载 作者:行者123 更新时间:2023-11-30 23:09:35 24 4
gpt4 key购买 nike

我正在尝试动态更改画笔的颜色。我写了一个非常简单的例子,但我不明白为什么它不起作用。

我已经在我的应用程序的 ResourceDictionary 中定义了前景颜色和使用该颜色作为 DynamicResource 的前景画笔:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Color x:Key="Foreground">#FF0000</Color>
<SolidColorBrush x:Key="ForegroundBrush" Color="{DynamicResource Foreground}" />

</ResourceDictionary>

然后,在我的 Window.xaml 中,我使用画笔设置文本 block 前景:

<Window x:Class="DictionaryColorTests.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<TextBlock Name="mTextBlock" Foreground="{DynamicResource ForegroundBrush}">This is just a text block</TextBlock>
<Button Name="Button1" Click="Button1_Click">Change color</Button>
</StackPanel>
</Grid>
</Window>

最后在我后面的代码中,我正在更改颜色:

private void Button1_Click(object sender, RoutedEventArgs e)
{
Application.Current.Resources["Foreground"] = Colors.Green;
}

不幸的是,画笔颜色没有更新。有人能解释一下为什么吗?

注意:我知道如果我直接改变画笔的颜色它工作很好,但我试图理解为什么使用颜色作为动态​​资源的 SolidColorBrush 不更新它的颜色变化时的颜色。


更新:使用它按预期工作的样式

如果我为文本 block 使用样式,只需更新颜色,它就可以正常工作并且画笔采用正确的颜色。直接使用笔刷和使用样式有什么区别?

<Style TargetType="TextBlock" x:Key="TextBlockStyle">
<Setter Property="Foreground" Value="{StaticResource ForegroundBrush}" />
</Style>

最佳答案

没有好的Minimal, Complete, and Verifiable code example可靠地重现了您的问题,因此无法确定问题出在哪里。但基本问题似乎是您正试图以不受支持的方式使用 DynamicResource

来自 the documentation :

Dynamic resource references have some notable restrictions. At least one of the following must be true:

•The property being set must be a property on a FrameworkElement or FrameworkContentElement. That property must be backed by a DependencyProperty.

•The reference is for a value within a StyleSetter.

•The property being set must be a property on a Freezable that is provided as a value of either a FrameworkElement or FrameworkContentElement property, or a Setter value.

Because the property being set must be a DependencyProperty or Freezable property, most property changes can propagate to UI because a property change (the changed dynamic resource value) is acknowledged by the property system. Most controls include logic that will force another layout of a control if a DependencyProperty changes and that property might affect layout. However, not all properties that have a DynamicResource Markup Extension as their value are guaranteed to provide the value in such a way that they update in realtime in the UI [emphasis mine]. That functionality still might vary depending on the property, as well as depending on the type that owns the property, or even the logical structure of your application.

您正在 SolidColorBrush 对象上设置属性,该对象不是 FrameworkElementFrameworkContentElement。该场景确实虽然满足文档中的第三个项目符号点(SolidColorBrush 是一个Freezable,而那个Freezable 是作为 FrameworkElement 的值提供)。但请注意我加粗的文字。即使满足这些要求,也不能保证它会起作用。

有趣的是,当在 FrameworkElement 直接拥有的 ResourceDictionary 的上下文中完成时,您尝试实现的基本方法确实有效(例如 Window)。

为什么会这样,我不知道。我的猜测是,只要您处于 FrameworkElement 某处 的上下文中,就会有足够的内部状态管理来处理更新 DynamicResource 代理,所以它让它发挥作用。

无论如何,这意味着一种可能的解决方法是将您的资源放入 Window.Resources 而不是您现在放置它们的任何位置。我不知道您是否可以指望它总是 正常工作;毕竟,该文档包罗万象,让 Microsoft 可以说“也许它会起作用,也许它不会”。但在我看来,这种情况可能不会很快被打破。

或者,您可以修改画笔资源本身。例如:

private void Button1_Click(object sender, RoutedEventArgs e)
{
Application.Current.Resources["ForegroundBrush"] = new SolidColorBrush(Colors.Green);
}

确实符合文档中的更多要求,因此似乎更有可能适用于任何 future 版本的 .NET(我已经验证它今天确实有效😊)。

关于c# - 如何使用 DynamicResource 更新 SolidColorBrush 颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45740435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com