本篇我們開始介紹任務欄的另一個亮點:跳轉列表(Jump Lists,下文簡稱JL)。JL 可以使用戶方便快捷的找到想要浏覽的文件(文檔、圖片、音頻或視頻等)以及應用程序的鏈接或快捷方式。以IE 浏覽器為例看看JL 都具備哪些功能:
· 在紅色區域“Taskbar Tasks” 放置了應用程序的一些默認任務:“打開IE 浏覽器”、“從任務欄取消固定”、“關閉程序”。無論是否對JL 做過開發“Taskbar Tasks” 列表都會出現在所有的應用程序中,例如之前的實例程序(如下圖)。
· “User Tasks” 包含了應用程序本身提供的一些功能,通過這些鏈接可以直接對應用程序進行操作。例如,打開一個新IE 標簽。
· “Known Category” 這個列表是Windows 7 默認類別,其中包含三種模式:“Recent”(近期浏覽)、“Frequent”(經常浏覽)、“Neither”。下圖即為Frequent 模式,它的功能是將經常浏覽的網頁內容記錄下來以便日後再次浏覽,隨著時間的流逝該列表中的網頁鏈接會隨之變化或消失。除了“Known Category” 列表外同樣也以創建“Custom Category”(下文將會慢慢講到)。
· “Pinned Category” 正如上面所講“Frequent Category” 列表中的網頁會經常變化,通過右鍵將網頁“釘”在列表中可使其永久保存(如下圖)。
創建User Tasks 列表
現在是不是也想為自己的程序添加一個JL,下面先來介紹如何創建User Tasks 列表。1. 通過JumpList 類創建一個JL 實例。2. 使用JumpListLink(string pathValue, string titleValue) 方法(pathValue:應用程序路徑,titleValue:鏈接名稱),可以將“記事本”、“畫板”這樣的Windows 應用程序,以及“網站地址”創建為User Tasks 鏈接。3. 再使用AddUserTasks(params IJumpListTask[] tasks) 方法將這些鏈接添加到JL 中。如下代碼所示:
private JumpList jumpList;
private string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
private void addAPPS_Click(object sender, RoutedEventArgs e)
{
IJumpListTask notepadTask = new JumpListLink(Path.Combine(systemPath, "notepad.exe"), "Notepad")
{
IconReference = new IconReference(Path.Combine(systemPath, "notepad.exe"), 0)
};
IJumpListTask paintTask = new JumpListLink(Path.Combine(systemPath, "mspaint.exe"), "Paint")
{
IconReference = new IconReference(Path.Combine(systemPath, "mspaint.exe"), 0)
};
IJumpListTask jlSeparator = new JumpListSeparator();
IJumpListTask linkTask = new JumpListLink("http://gnielee.cnblogs.com", "GnIE's Blog")
{
IconReference = new IconReference("C:\\Program Files\\Internet Explorer\\IExplore.exe", 0)
};
jumpList.AddUserTasks(notepadTask, paintTask, jlSeparator, linkTask);
jumpList.Refresh();
}
在上面程序中,通過IJumpListTask 接口創建了“程序鏈接”(JumpListLink,其中IconReference 為鏈接圖標)和“分割線”(JumpListSeparator);使用AddUserTasks 方法時注意每個鏈接的位置關系;最後必須使用Refresh 方法對JL 進行刷新才能顯示出最新的JL 內容(如下效果圖)。
創建Known Category 列表
在使用Known Category 功能前,需要先為程序注冊文件類型,隨後可通過KnownCategoryToDisplay 屬性將Known Category 預設為“Recent”、“Frequent”、“Neither” 中的任意一種類型,當測試程序打開某個的文件時,相應的文件鏈接就會顯示在Known Category 列表中。如下代碼所示:
if (!UtilitIEs.IsApplicationRegistered(TaskbarManager.Instance.ApplicationId))
{
UtilitIEs.RegisterFileAssociations(TaskbarManager.Instance.ApplicationId, false,
TaskbarManager.Instance.ApplicationId, Assembly.GetExecutingAssembly().Location,
".jpg", ".png", ".gif", ".JPG", ".PNG", ".GIF");
}
jumpList.KnownCategoryToDisplay = JumpListKnownCategoryType.Recent;
CommonOpenFileDialog cfd = new CommonOpenFileDialog();
cfd.ShowDialog();
jumpList.Refresh();
打開demo.png 文件後的JL 效果:
JumpListKnownCategoryType 枚舉中定義了Known Category 的三種類型:“Neither”、“Recent”、“Frequent”,還可以通過KnownCategoryOrdinalPosition 屬性可以修改Known Category 在JL 中的位置:
switch (this.knownCategory.SelectionBoxItem.ToString())
{
case "None":
jumpList.KnownCategoryToDisplay = JumpListKnownCategoryType.Neither;
break;
case "Recent":
jumpList.KnownCategoryToDisplay = JumpListKnownCategoryType.Recent;
break;
case "Frequent":
jumpList.KnownCategoryToDisplay = JumpListKnownCategoryType.Frequent;
break;
}
jumpList.KnownCategoryOrdinalPosition = Convert.ToInt32(this.categoryPostion.SelectionBoxItem.ToString());
jumpList.Refresh();
將Recent 修改為Frequent 後的效果:
創建Custom Category 列表
如同上文創建JumpList 的方式,1. 通過JumpListCustomCategory 類創建“自定義分類”列表實例。2. 由JumpListCustomCategory(string categoryName) 方法為列表命名。3. 使用AddJumpListItems 方法將鏈接加入到分類中。如下代碼所示:
private JumpListCustomCategory customCategory;
private void addCus_Click(object sender, RoutedEventArgs e)
{
if (this.categoryName.Text.Length > 0)
{
customCategory = new JumpListCustomCategory(this.categoryName.Text);
jumpList.AddCustomCategorIEs(customCategory);
JumpListLink jlItem = new JumpListLink(Assembly.GetExecutingAssembly().Location, this.categoryName.Text + ".png")
{
IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 0)
};
customCategory.AddJumpListItems(jlItem);
jumpList.Refresh();
}
}
KnownCategoryOrdinalPosition效果
在上面代碼中IconReference 取自應用程序本身的Icon 屬性,前提是需要在應用程序屬性中為其設置圖標資源(如下圖所示)。至此,在Windows 7 中對任務欄的相關開發已全部完成,希望本系列對大家有所幫助。