- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试动态更改画笔的颜色。我写了一个非常简单的例子,但我不明白为什么它不起作用。
我已经在我的应用程序的 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
对象上设置属性,该对象不是 FrameworkElement
或 FrameworkContentElement
。该场景确实虽然满足文档中的第三个项目符号点(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/
我想从十六进制值(例如#ffaacc)创建SolidColorBrush。我怎样才能做到这一点? 在 MSDN 上,我得到: SolidColorBrush mySolidColorBrush = n
我有这条线并且它有效但是我如何返回一个自定义颜色字符串例如“#2228D4” return (Boolean)value ? new SolidColorBrush(Colors.Red) : new
我正在尝试比较 2 支画笔,如您在图片中所见。我不知道为什么它会失败...... 最佳答案 它们不会相等,因为它正在进行引用比较,并且它们是堆中具有相同属性的两个不同引用。 如果你想控制对象比较,你应
我正在执行以下操作以填充具有一定不透明度的矩形。 SolidColorBrush fillColor = new SolidColorBrush(myColor); fillColor.Opaci
如何将转换 颜色名称 为SolidColorBrush 类型?我的意思是“黄色”这个词。 SolidColorBrush scb = ??? ; // "Yellow" 谢谢! 最佳答案 要获取颜色
我有一个进度条,我想根据 bool 值更改颜色; true 为绿色,false 为红色。我的代码看起来应该可以工作(当我将它绑定(bind)到文本框时它返回正确的值),但当它是进度条的颜色属性时却不行
我在ResourceDictionary中设置了SolidColorBrush和LinearGradientBrush资源的负载。我在重新设计几个控件以供我们的应用程序使用时使用了它们。 现在,我还需
我在 xaml 中定义了一个资源: ... 我正在尝试从代码中设置它: void _administrationClient_GetByFilterModule
我想要什么 我想在多个 UserControl 类型中重复使用某些样式。 我希望一些Border控件的背景闪烁,我希望它们都使用相同的样式、静态资源和动画,以便它们都同步闪烁。 我是如何做到的 为此,
我有一个用户控件,它使用如下的画笔资源为控件中的几个元素提供颜色: 现在,我想使用触发器更改此资源的颜色,以便在发生特定条件时提供高亮显示
我试图用 WP7.1 中可用的所有预定义 SolidColorBrushes 填充列表,但我无法通过代码执行此操作。我已经用一个简短的测试颜色列表手动完成了这个,它工作正常,但是有超过一百种不同的预定
没有处置 SolidColorBrush 的选项。 如何防止 SolidColorBrush 对象发生内存泄漏? 我什至不能使用“使用”,因为 SolidColorBrush 没有实现 IDispos
如何在运行时更改正在另一个资源字典中使用的资源字典的颜色? 这是我的设置: Colours.xaml: 样式.xaml: Window.xaml ..... .
ListView 的 itemtemplate 内有一个边框,如下所示:
我有一个通过 SignalR 接收动态更新的 UWP 应用程序。我使用的是 Template10,SignalR 监听器位于 ViewModel 类中。 当 SignalR 收到消息时 - 模型会更新
是否可以通过动画将 Ellipse.Fill 从 LinearGradientBrush 更改为 SolidColorBrush 或更改 LinearGradientBrush 中的 gradient
好吧,这一直困扰着我,我还没有真正找到任何明确的答案作为 Color 之间差异的原因/原因。 & SolidColorBrush所以我想知道是否有人可以教育我。 我已经知道用法上的差异,例如我可以使用
我正在尝试在 Silverlight 中编写一个 IValueConverter。此 IValueConverter 将返回一个 SolidColorBrush。转换器将传递一个十六进制值,如“FFF
xaml 中的这种填充矩形是否可行? 我不想使用渐变来填充矩形,因为在每个部分使用纯色画笔的图像不同。 谢谢 最佳答案 试试这个:
这个问题在这里已经有了答案: Convert string to Brushes/Brush color name in C# (10 个答案) 关闭 8 年前。 我正在尝试将 string 转换为
我是一名优秀的程序员,十分优秀!