你是sleeping on UI thread
它凍結了你的UI線程,因此你在用戶界面上看不到任何更新。
控件的重畫是由UI調度器完成的,但調度器根據任務的優先級設置執行 操作。在調度程序優先級設置爲Render時,對 控件進行重繪。設置 按鈕的內容在具有優先級渲染的調度程序中排隊,但是隻有在所有具有較高優先級的任務完成後纔會執行的操作 。
正如其他人已經建議你應該在單獨的線程上移動你的長時間運行的任務,但還有另一個workaroud在睡在UI線程之前刷新GUI。就像我提到的,一旦所有高於DispatcherPriority.Render
的任務完成,UI將重新繪製。所以,你可以做的是before sleeping on thread enqueue an empty delegate with render priority synchronously
這將force dispatcher to perform all tasks above and with priority render
之前轉移到下一個任務。這就是我的意思 -
private void button3_Click(object sender, RoutedEventArgs e)
{
button3.Content = "Printing...";
button3.IsEnabled = false;
Dispatcher.Invoke((Action)(() => { }), DispatcherPriority.Render); <-- HERE
// button3.Refresh(); <-- After having extension method on UIElement.
Thread.Sleep(1000);
button3.IsEnabled = true;
button3.Content = "Print";
}
你也可以有這樣的方法擴展方法上的UIElement -
public static void Refresh(this UIElement uiElement)
{
uiElement.Dispatcher.Invoke((Action)(() => { }), DispatcherPriority.Render);
}
而且睡在UI線程之前調用簡單button3.Refresh()
。
但是,這有一個缺點太,因爲它不僅將刷新BUTTON3 但其在UI未決刷新所有其他控件,因爲調度員將移動到下一個之前完成所有任務 優先渲染或更高版本任務。
但請記住永遠不要在UI線程上睡覺。
已知問題。您需要使用調度程序來將用戶界面同步到您的內容。 –
@daveL,按鈕沒有Text屬性 –
在UI事件處理程序中調用Thread.Sleep會阻止UI線程。搜索「UI凍結」或「阻止UI線程」或類似的StackOverflow以獲得大量答案。 – Clemens