1、控件介紹
在 WPF 中使用的等待控件,控件包括三種,普通的等待信息提示(WaitTip),進度條提示(WaitProgress),以及主程序覆蓋的模擬時鐘等待窗口(WaitClock),具體效果看下面的圖示。html
- 支持自定義等待信息
- 支持在異步線程中設置進度或者關閉等待窗口
- 支持覆蓋某個 UIElementCollection,或者覆蓋當前主程序或者某個 Window
2、圖示效果

3、細節說明
- 覆蓋某個 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。以下代碼所示:ui
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 方法會佔住主線程,除非關閉,不然後面的代碼沒法運行。this
- WaitProgress 支持設置 IsIndeterminate 屬性,便是顯示實際值,仍是顯示通常的連續進度反饋。以及進度到達 100%後是否自動關閉進度條。
- WaitClock 主要是經過 Path 繪製時針、分針和秒針,而後在 DispatcherTimer 的 Tick 事件中不斷更新三針的角度便可,固然要設置好三針的旋轉中心,詳細內容可參考代碼。
- 最後,在異步線程中操做 UI 元素,採用了下面簡單的處理:
UI.Dispatcher.BeginInvoke((Action)delegate (){
// 操做 UI 代碼
});
4、資源下載
dll+源工程以及Demo工程下載:http://files.cnblogs.com/files/memento/WaitControl.7zspa