一、控件介紹
在 WPF 中使用的等待控件,控件包括三種,普通的等待信息提示(WaitTip),進度條提示(WaitProgress),以及主程序覆蓋的模擬時鍾等待窗口(WaitClock),具體效果看下面的圖示。
- 支持自定義等待信息
- 支持在異步線程中設置進度或者關閉等待窗口
- 支持覆蓋某個 UIElementCollection,或者覆蓋當前主程序或者某個 Window
二、圖示效果
三、細節說明
- 覆蓋某個 UIElementCollection,是在 UIElementCollection 中添加等待控件之后,等待控件的背景面板覆蓋住 UIElementCollection,達到用戶無法操作 UIElementCollection 的效果,同時又不影響 UIElementCollection 之外的其他控件。
- 覆蓋主程序或者某個 Window,是將等待控件放置於一個子 Window 中,並設置該子 Window 的如下屬性:
- WindowStyle = WindowStyle.None
- Background = new SolidColorBrush(Colors.Transparent) (設置背景為透明色,配合下一條使用)
- AllowsTransparency = true (允許透明色)
- Owner = parentWindow (設置依附的父窗口)
- WindowStartupLocation = WindowStartupLocation.CenterOwner (位於父窗口中央)
- SizeToContent = SizeToContent.WidthAndHeight (保證 Window 跟隨內部的內容大小)
- ShowInTaskbar = false (不在任務欄顯示該窗口)
- Content = this(等待控件)
最后在異步線程啟動之后,調用該子 Window 的 ShowDialog 方法即可。
需要注意的是,如果在異步線程啟動之前,調用了子 Window 的 ShowDialog 方法,則是無法在異步線程中關閉等待控件,即子 Window。如下代碼所示:
private void btnWaitTipTest2_Click(object sender, RoutedEventArgs e) { WaitTip waitTip = new WaitTip(this); Thread t = new Thread(new ThreadStart((Action)delegate { try { for (int i = 0; i <= 5; i++) { Thread.Sleep(1000); } waitTip.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } })); t.Start(); waitTip.Show("WaitTip Control Test2"); }
上面代碼最后兩行,如果互換位置,依舊可以顯示等待控件,但是子線程就不會運行,也就不會關閉等待控件了,因為 Window 的 ShowDialog 方法會占住主線程,除非關閉,否則后面的代碼無法運行。
- WaitProgress 支持設置 IsIndeterminate 屬性,即是顯示實際值,還是顯示一般的連續進度反饋。以及進度到達 100%后是否自動關閉進度條。
- WaitClock 主要是通過 Path 繪制時針、分針和秒針,然后在 DispatcherTimer 的 Tick 事件中不斷更新三針的角度即可,當然要設置好三針的旋轉中心,詳細內容可參考代碼。
- 最后,在異步線程中操作 UI 元素,采用了下面簡單的處理:
UI.Dispatcher.BeginInvoke((Action)delegate (){ // 操作 UI 代碼 });
四、資源下載
dll+源工程以及Demo工程下載:http://files.cnblogs.com/files/memento/WaitControl.7z