如何使用 DynamicResource 更新 SolidColorBrush 颜色?

2024-04-16

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

我在我的应用程序的 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 中,我使用画笔设置文本块前景:

<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 在颜色更改时不会更新其颜色。


更新:使用一种可以按预期工作的样式

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

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

没有好的最小、完整且可验证的代码示例 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 的任何未来版本(我已经验证它今天确实有效????)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 DynamicResource 更新 SolidColorBrush 颜色? 的相关文章

  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • C# Winforms Designer 无法打开,因为它无法在同一程序集中找到类型

    我收到以下错误 找不到类型 My Special UserControl 请确保引用包含此类型的程序集 如果此类型是您的开发项目的一部分 请确保已使用当前平台或任何 CPU 的设置成功构建该项目 但没有任何意义的是My Special Us
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 无法获取本地或参数的值,因为它在此指令指针处不可用,可能是因为它已被优化掉

    Visual Studio 2010 会删除 没有其他词 不安全块中函数参数之一中的数据 什么可能导致此错误 调试器显示以下消息 Cannot obtain value of local or argument as it is not a
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到

随机推荐

  • 自执行功能不起作用?

    我有代码 function i alert i 3 我不明白为什么我看不到警报 这个语法是什么意思 以及为什么这段代码 function i alert i 3 有效吗 有什么不同 我缺少什么 第一个片段将被解释为函数声明 它需要一个名称
  • gitlab-ci.yml&docker-in-docker(dind)&curl 在共享运行器上返回连接被拒绝

    我正在尝试创建一个简单的 GitLab CI 在其中使用 docker compose up 启动一个容器 然后尝试使用curl 访问它 最后使用 docker compose down 将其拆除 docker compose up 旋转得
  • 使用小数分隔符和千位分隔符验证小数

    您好 我使用这个正则表达式来验证带有小数分隔符和千位分隔符的数字 ets eds 0 9 ets eds 0 9 但是这个fail 它不应该接受 对于我的两个单元测试用例 12 and 1 2 有人可以帮忙吗 注意 这项工作适用于1 2 让
  • 如何使用node.js驱动程序复制mongodb集合?

    有没有办法通过 Node js mongodb 驱动程序复制集合 i e collection copyTo duplicate collection 您可以评估copyTo 服务器端虽然它会阻止整个 mongod 进程并且不会在新集合上创
  • 中小型 .NET 应用程序的数据库(和 ORM)选择

    我需要开发一个基于 NET 的应用程序 其数据需求可能超过 SQL 2005 Express Edition 的 4 gig 限制 由于内部 DBA 的专业知识 同一应用程序的其他客户 将来 可能需要使用特定的数据库平台 例如 Oracle
  • 在 Rails 表单错误消息中显示链接

    在我们的注册表单上 我们validates uniqueness of email 当用户尝试使用我们的注册表单并指定现有的电子邮件地址时 我希望他们看到这样的错误消息 该邮件地址已被使用 如果您在登录时遇到问题 您可以重置你的密码 htt
  • 如何计算闰年?

    我对闰年有一些疑问 如何通过使用这样的公式来确定 add years function x y if isTRUE all equal y round y stop Argument y must be an integer n x lt
  • UIImageview 以快速编程方式

    我只是想创建一个UIImage以编程方式查看 我有一个新视图 我尝试这样做 let imageName yourImage png view backgroundColor UIColor colorWithPatternImage UII
  • 如何使用maven pom.xml创建jar

    我需要一个示例 pom 文件来为我的 spring 项目创建 jar 文件 创建jar文件时如何指定创建资源的目录和文件夹 我可以使用 pom jar 文件创建 jar 文件 但我需要将 applicationContext xml 包含在
  • 在 PHP 中使用 pthreads 创建异步超时

    我正在尝试在 PHP 中创建某种异步超时 我使用 PECL 扩展 pthreads 来实现多线程 异步超时工作正常 但参考却不然 我使用 PHP 5 5 8 进行此测试 class ParentClass public test publi
  • tensorflow conv2d偶数步长和奇数步长之间的不同起始索引

    据我了解从tf nn conv2d 文档 https www tensorflow org api docs python tf nn conv2d对于相同的卷积 无论步幅如何 第一个点积应以 0 0 为中心 正如您在下面看到的 当步幅为奇
  • 如何从 boost::shared_ptr 释放指针?

    boost shared ptr 可以释放存储的指针而不删除它吗 我可以看到文档中不存在释放函数 并且在常见问题解答中也解释了为什么它不提供释放函数 例如不能在不唯一的指针上完成释放 我的指点是独一无二的 我怎样才能释放我的指针 或者使用哪
  • 我应该为 SCJP 准备多长时间? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 好吧 我知道这可能听起来有点傻 因为这取决于个人 但平均来说我应该花多少时间来准备 SCJP 我已经有一些 Java 经验 我的大学的一些中小型项目
  • 导入XML - JavaScript?导入的内容为空[重复]

    这个问题在这里已经有答案了 我正在尝试导入一个字段 该字段有助于指示餐厅当前是否接受在线订单 INDEX IMPORTXML https www doordash com store yolk test kitchen chicago 39
  • 保存并加载 keras 自动编码器

    看看这个奇怪的加载 保存模型情况 我保存了变分自动编码器模型及其编码器和解码器 autoencoder save autoencoder save overwrite True encoder save encoder save overw
  • 想要下载Git仓库,我需要什么(windows机器)?

    我想下载这个开源应用程序 他们正在使用 Git 下载代码库需要什么 Update使用 Git Bash 时如何更改工作目录 我想将存储库下载到某个目录 使用 pwd 告诉我我将在不需要的地方下载存储库 下载Msys 上的 Git http
  • 如何重定向 python 中函数的打印输出[重复]

    这个问题在这里已经有答案了 可能的重复 我可以将 python 中的标准输出重定向到某种字符串缓冲区吗 https stackoverflow com questions 1218933 can i redirect the stdout
  • 当模型以编程方式更改时调用 ngChange

    当以编程方式更改模型时调用 Angular 的 ng change 时 我遇到问题 scope sendMessage function scope message Message sent scope confirmed true sco
  • 帮助使用 GPS 坐标,Android

    我正在使用此代码来获取我的位置并在屏幕上打印坐标 package com example alpha import android app Activity import android content Context import and
  • 如何使用 DynamicResource 更新 SolidColorBrush 颜色?

    我正在尝试动态更改画笔的颜色 我写了一个非常简单的例子 但我不明白为什么它不起作用 我在我的应用程序的 ResourceDictionary 中定义了一个前景色和一个使用该颜色作为 DynamicResource 的前景画笔