WPF: 使用CommandManager.InvalidateRequerySuggested手动更新Command状态

WPF判断命令(Command)是否能够执行是通过ICommand.CanExecute事件,在实际程序中路由命令一般是通过CommandBinding来使命令得到实际操作代码,但是这个CanExecute事件的调用是由WPF控制的,有些时候,比如命令执行后进行一些异步耗时操作,操作完成后会影响CanExecute事件结果,但是WPF不会立即做出反应,那么这个时侯就需要手动调用CommandManager.InvalidateRequerySuggested对命令系统进行一次刷新。

 

比如下面这个小程序

<Window.CommandBindings>
<CommandBinding Command="New" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" />
</Window.CommandBindings>
<StackPanel>
<Button Command="New">执行工作</Button>
<TextBlock Name="tbl" Text="等待执行"></TextBlock>
</StackPanel>

 

事件执行:

//
// 事件执行代码
//

privatevoid CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute =!finished;
}

privatevoid CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
System.Threading.ThreadPool.QueueUserWorkItem(dowork);
}

bool finished =false;
void dowork(object obj)
{
updateUI("开始工作");
System.Threading.Thread.Sleep(1000);
updateUI("工作结束");
finished =true;
}

void updateUI(string msg)
{
Dispatcher.BeginInvoke((Action)(() => tbl.Text = msg));
}

程序按钮点击后下面文字显示“工作结束”,这时按钮理应是禁用的(因为此时CanExecute结果是false),但实际上按钮没有被禁用,只有界面发生改变后(如焦点,按键变化,或者按钮再次被点击),按钮才会被禁用,因为此时WPF才调用相应的CanExecute事件。

 

手动调用CommandManager.InvalidateRequerySuggested就可以解决问题,注意这个函数只有在UI主线程下调用才会起作用。 

void dowork(object obj)
{
updateUI("开始工作");
System.Threading.Thread.Sleep(1000);
updateUI("工作结束");
finished =true;
//手动更新
updateCommand();
}

void updateCommand()
{
Dispatcher.BeginInvoke((Action)(() =>CommandManager.InvalidateRequerySuggested()));
}

 

转载于:https://www.cnblogs.com/zjoch/p/3647236.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从开发小白到音视频专家

音视频方面的技术博客&#xff0c;转发学习 作者&#xff1a;卢俊&#xff0c;七牛云客户端团队技术负责人。拥有丰富的音视频领域的开发和实战经验&#xff0c;先后开发过 Android 播放 SDK、Android 推流 SDK、短视频 SDK&#xff0c;并主导了七牛连麦系统的设计和实现。服务…

Android如果对APK进行加密,提高反编译难度(思路)

提高反编译难度的几种方式&#xff1a; 对于软件安全来说&#xff0c;有攻就要有防才对。不然&#xff0c;Android整个产业链就会被这样的Crack给毁掉。 第一种办法&#xff1a;将核心代码用JNI写进so库中。由于so库的反编译和破解的难度加大&#xff0c;所以这种方式防止反编译…

node-media-server win环境安装架测试 踩坑记

01 因为老师的项目中需要很多流媒体模块的东西&#xff0c;接触到 Node-Media-Server 这个流媒体服务器&#xff0c;这个国人开发的组件&#xff0c;之前还有SRS也是的。记录一下问题和效果。   本子是win7&#xff0c;之前还有装nodejs时版本的问题&#xff0c;这里插一曲&a…

UIScrollview 技巧

设置UIScrollView的contentSize 如果使用自动布局&#xff0c;那么它会自动帮你基于这个scrollview的子视图的约束来计算这个内容大小。在非自动布局情况下&#xff0c;如果app旋转导致scrollview 的bounds改变&#xff0c;不会影响到scrollview的contentSize&#xff0c;而如果…

markdown 编辑器 编辑字体样式(颜色 大小 字体等)

markdown编辑器   编辑改字体样式得用html标签这套东西&#xff0c;更改字体大小,字体&#xff0c;颜色。 即 <font></font> <font 语法> 你的内容 </font>语法&#xff1a;color#0099ff 更改字体颜色&#xff0c;颜色 写&#xff08;Red、#F…

【转】介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX

原文来自&#xff1a;http://blog.sciencenet.cn/blog-404069-297233.html 作复杂网络研究离不开对各种实际或模拟网络的统计、计算、绘图等工作。对于一般性的工作&#xff0c;我们可以用Pajek、Netdraw和Ucinet等软件完成。但对一些特殊应用&#xff08;比如自己开发了一个新…

初识Node.js之Node.js与java作为后台服务器的对比

最近去了新公司&#xff0c;又拾起了被我抛下许久的后端了&#xff0c;不过因为公司的需求&#xff0c;后端采用Node.js&#xff0c;最近一直在学习Node.js,随着逐渐深入的了解&#xff0c;发现真的Node.js能越来越变得热门是有其存在的道理的。可能有人会说&#xff0c;Java作…

SQL生成日期维度(到小时)

#建表语句&#xff1a; CREATE TABLE [dbo].[Dim_日期3]([日期3ID] [varchar](10) NOT NULL,[年] [int] NULL,[半年] [varchar](6) NULL,[季] [varchar](2) NULL,[月] [varchar](4) NULL,[周] [varchar](6) NULL,[星期] [varchar](6) NULL,[是否周末] [varchar](4) NULL,[日] […

NiFi导出自己模板和导入别人模板

NiFi导出模板 进入nifi系统后&#xff0c;选择自己想要导出的流程或者组&#xff08;支持group作为模板导出&#xff09; 点击空白处&#xff0c;右键选择create template 模板文件下载成功 NiFi导入模板 点击空白处&#xff0c;右键选择upload template 查看导入结…

/MD, /MDD, /ML, /MT,/MTD(使用运行时库) .

1. VC编译选项 多线程(/MT)多线程调试(/MTd)多线程 DLL (/MD)多线程调试 DLL (/MDd) 2. C 运行时库 库文件Single thread(static link) ML libc.libDebug single thread(static link) MLd lib…

Node.js开发入门(一)——安装Node.js及编辑器配置

Node.js是一个轻松构建快速&#xff0c;可扩展的网络应用平台建立在Chrome的JavaScript运行。Node.js使用事件驱动&#xff0c;非阻塞I/O模型&#xff0c;使得它重量轻&#xff0c;高效&#xff0c;完美的数据密集型实时应用程序运行在分布式设备。 Node.js是让JavaScript脱离浏…

存储过程执行权限

最后更新时间: 2014年4月13日,星期日存储过程分为两种&#xff0c;即DR(Definers Rights ) Procedure和IR(Invokers Rights ) Procedure。为什么会有两种存储过程呢&#xff1f;比如说用户user02创建了修改表t1的存储过程&#xff0c;当用户user01调用时,是修改的user01自己的t…

架构风格与基于网络的软件架构设计

原文链接 https://blog.csdn.net/on_1y/article/details/60358117 架构风格与基于网络的软件架构设计 如今许多服务都采用了 RESTful API, 而 REST 这一架构风格&#xff0c;最早即来源于 Roy Thomas Fielding 的博士论文 Architectural Styles and the Design of Network-bas…

2009年广东省大学生程序设计竞赛 A

// 水题&#xff0c;数高为 2 就可以 既把2-n 点 都连到 1 点&#xff0c;#include<cstdio>#include<iostream>#include<map>#include <set>#include<cstring>#include<queue>#include<algorithm>#include<vector>using names…

视频容器与编解码器的区别

这基本是一个老生常谈的东西了&#xff0c;但是我仍然是看了很多资料&#xff0c;加上一点点理解才完全明白了其中的差别所在。 这就像上学时的考试大纲&#xff0c;这种东西要求是识记类型的&#xff0c;没有技术门槛&#xff0c;但是只有你把东西都记住之后&#xff0c;才完全…

C#生成高清缩略图

01/// <summary> 02 /// 为图片生成缩略图 03 /// </summary> 04 /// <param name"phyPath">原图片的路径</param> 05 /// <param name"width">缩略图宽</param> 06 /// <param name"height"…

win7安装nodejs 高版本不支持 换低版本

win7安装nodejs失败 显示This application is only supported on Windows 8.1,Windows Server 2012 R2,or higer. win7安装nodejs失败 在win7重装nodejs&#xff0c;版本是node-v14.16.1-x64&#xff0c;安装时报了win7系统不支持的问题 2021年4月8日 —— 目前除了最新的v14大…

[翻译]创建ASP.NET WebApi RESTful 服务(9)

一旦成功的发布API后&#xff0c;使用者将依赖于你所提供的服务。但是变更总是无法避免的&#xff0c;因此谨慎的制定ASP.NET Web API的版本策略就变得非常重要。一般来说&#xff0c;新的功能需要无缝的接入&#xff0c;有时新老版本需要并行&#xff0c;以便给使用者足够的时…

研究生导师一般希望招什么样的研究生?

虽然还不是导师&#xff0c;但也在学校蹲了不少年头了&#xff0c;看着一级级研究生毕业奔赴各方&#xff0c;其实还是蛮有感触的。 各位同学很多在硕士期间回忆并不算好&#xff0c;其实就是从一开始没有搞明白一件事&#xff1a;导师招生为了什么&#xff0c;我们上研又为了什…

动态调用链接库(dll) 续

20141118 最近一周做了一个关于仓库管理&#xff0c;拣货任务分配的模块&#xff0c;其中涉及到刷卡自动打印领取任务的功能点。 技术点&#xff1a; C#调用C、delphi的动态链接库。动态链接库的调用方法不同。效果也不相同。 DLL位置&#xff1a;执行程序根目录下面 例&#x…