如上,這兩種顏色提示,第一種(左邊的)是進度條提示,在檔案操作中,下載軟體或者播放器程式表徵圖中都有。它的長度可以是一定值的也可以是那種不斷滑動的代表不確定進度。同時顏色的不同也代表不同的狀態,正常狀態是綠色,暫停狀態是黃色,錯誤狀態是紅色。
第二種顏色則是不停地閃爍,在即時通訊軟體中很常見。
先說第二種,原理就是使用Win32的FlashWindowEx API,我們可以使用一個WPF的擴充方法封轉(參考:這裡),這樣一切都非常簡單,調用Window的擴充方法FlashWindow就可以了(還可以傳遞一個參數,代表要閃多少次,預設是UInt32的最大值)。
至於第一種,先想到的是用微軟的Windows API Code Pack類庫,注意這個特性是Windows 7或其之後的Windows系統才有的,所以執行前最好判斷一下作業系統版本。
在Windows API Code Pack中的命名空間:MS.WindowsAPICodePack.Internal有一個CoreHelpers類型可以判斷當前Windows系統版本並拋出異常:
或者手動判斷(Windows 7的版本號碼是6.1):
var os = Environment.OSVersion;
if (os.Platform == PlatformID.Win32NT && os.Version.CompareTo(new Version(6, 1)) >= 0)
{
//>= Windows 7
}
else
{
//不具備Windows 7的功能
}
接下來就是主代碼了,引用Microsoft.WindowsAPICodePack.Shell.dll加入Microsoft.WindowsAPICodePack.Taskbar命名空間,通過TaskManager的Instance擷取TaskManager執行個體,然後調用SetProgressValue和SetProgressState設定進度值和進度類型就OK了。比如:
//+ using Microsoft.WindowsAPICodePack.Taskbar;
//三分之二長度
TaskbarManager.Instance.SetProgressValue(2, 3);
//紅色
TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Error);
結果:
設定不確定進度:
TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Indeterminate);
結果:
有一個好訊息就是WPF 4後,這些已經被整合到.NET Framework中了,在System.Windows.Shell命名空間內,程式集是PresentationFramework(所有WPF程式都會預設載入的)。所以完全不需要Windows API Code Pack,加入System.Windows.Shell命名空間後,使用下面代碼:
//+ using System.Windows.Shell (WPF 4+);
var taskbarinfo = new TaskbarItemInfo();
//0 ~ 1.0 是進度值
taskbarinfo.ProgressValue = 1.0 / 3 * 2;
taskbarinfo.ProgressState = TaskbarItemProgressState.Error;
//通過Window類型的TaskbarItemInfo屬性設定TaskbarItemInfo對象
this.TaskbarItemInfo = taskbarinfo;
結果: