WPF: 使用CommandManager.InvalidateRequerySuggested手动更新Command状态
生活随笔
收集整理的這篇文章主要介紹了
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
總結
以上是生活随笔為你收集整理的WPF: 使用CommandManager.InvalidateRequerySuggested手动更新Command状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拷贝人家的
- 下一篇: Windows下断言的类型及实现