当前位置:首页 > Windows程序 > 正文

WPF中异步更新Command可用逻辑时按钮状态没有更新

2021-05-26 Windows程序

  在这样一种场景,通过点击一个按钮来执行一段耗时的逻辑,在这段逻辑执行完时设置另外一个按钮的可用状态,通过CanExecuted影响。示例如下:

  

技术分享

  其中,扫行逻辑的代码如下:

  

private ICommand _setWaitCommandExecuted; public ICommand SetWaitCommandExecuted { get { if (null == _setWaitCommandExecuted) _setWaitCommandExecuted = new RelayCommand(() => {
              //异步线程 Task.Run(()
=> { System.Threading.Thread.Sleep(1000);//模拟耗时操作 CanWaitExecuted = true;//设置Wait的状态可用,对于Wait的Command中的CanExecuted,只是简单的返回该值 }); }); return _setWaitCommandExecuted; } }

  F5运行结果如下:

技术分享

  UI上Wait的按钮没有刷新。这是一个问题。经过从网上查找资源,发现了一种解决方式。

  方案一:

  既然UI上绑定按钮的状态没有刷新,那就用一种比较霸道的方式,强制让UI刷新按钮的状态,即调用CommandManager.InvalidateRequerySuggested()这段代码。注意这句代码需要封送到UI线程中执行。

  方案二:

  出现该问题的一个原因在于异步线程中列新按钮的逻辑,那么将这段逻辑封送到UI线程中会不会解决问题呢?这里就不志关子了,实验是可以的。下面就贴出两种方案的示例代码,,大家可以自行试验。

public ICommand SetWaitCommandExecuted { get { if (null == _setWaitCommandExecuted) _setWaitCommandExecuted = new RelayCommand(() => { Task.Run(() => { ////window.Invoke(() => ////{ //// //模拟一个耗时操作 //// System.Threading.Thread.Sleep(1000); //// //方案一:在UI线程中更改 //// CanWaitExecuted = true; ////}); //System.Threading.Thread.Sleep(1000); //CanWaitExecuted = true; ////方案二:UI线程中进行强制刷新 //window.Invoke(CommandManager.InvalidateRequerySuggested); }); }); return _setWaitCommandExecuted; } }

WPF中异步更新Command可用逻辑时按钮状态没有更新

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71346.html