【Win10】探索 Windows 10 10586 之 JumpList(跳轉列表)
Windows 10 10586 出來了也挺久的了,應該大部分都從 10240 升級到這個版本了。在 10586 中,微軟添加了 200 多個新的 API,具體 API 的變動,大家可以點選下面這個連結來看:
http://martinsuchan.github.io/ApiPeek/Diffs/win10.10240.to.win10.10586.fulldiff.html
其中不乏許多人都感興趣的 HoloLens 的 API。不過現在連工程機都沒幾個人有的情況下(而且出了我也買不起),我還是看一下有什麼實用點的 API 了吧→_→。粗略翻閱一下,JumpList(我稱它為跳轉列表)這個算是相當有用的了。
開啟 Visual Studio 2015 Update 1,新建一個空白的 UWP 工程,然後在專案上右鍵 → 屬性。
或許有些小夥伴還是分不清這兩個的含義和區別,這裡我稍微說明下:
目標版本是指你能使用的 API 的版本,JumpList 這個 API 是 10586 的,因此這裡如果你選擇的是 10240 就沒法用了。
而最低版本則是使用者能安裝你這個 APP 的版本,只有等於或高於的使用者才能安裝。
那麼你又會問了,像上面圖片這樣的,10240 的使用者安裝了這個 APP,然後執行到 10586 的 API 的程式碼會怎樣。答案就是會產生一個異常,但是,微軟也給出了相應的解決方案,那就是在呼叫這些 API 之前先檢查是不是能用,這個類就是
由於 ApiInformation 類的方法的引數都是字串形式的,我們很容易敲錯,因此在這裡,我先強烈推薦一個程式碼分析器!!!
https://www.nuget.org/packages/PlatformSpecific.Analyzer/
程式碼分析器是 VS 2015 的新功能,是基於 roslyn 的,roslyn 這個東西比較複雜,這裡我就不班門弄斧了。像一般的 nuget 包那樣安裝就行了。
安裝完之後是這樣的:
在 MSDN 上我們可以看到,JumpList 目前是隻支援 Desktop 的,IsSupported 正是為了檢測這個。
那麼寫下如下程式碼:
可以看見程式碼被標註了綠色的波浪線,這個就是我前面為什麼要安裝分析器的原因。然後點選小燈泡後選擇第一項。程式碼就會變成下面那樣:
此時波浪線也消失了,這樣 10240 的機器就不會呼叫到裡面程式碼,而 10586 或以上的機器就能呼叫到裡面的程式碼。
接下來我們可以呼叫 JumpList 的 LoadCurrentAsync 方法來讀取該 APP 的跳轉列表。
然後可以獲取到 JumpList 的例項了。
JumpList 類有三個例項成員:
Items 屬性是指裡面的項,SaveAsync 方法一眼就看出是儲存。SystemGroupKind 我先不管放一邊,最後再管它。
然後對 Items 屬性操作一下,最後呼叫儲存:
執行之後,工作列:
開始選單:
開始螢幕(也就是開始選單右側磁貼部分):
然後斷點 App.xaml.cs 之後,點選 JumpList 的測試這個項後會觸發 OnLaunched 方法。
所以在 OnLaunched 裡面處理 JumpList 傳遞過來的引數跟二級磁貼的方式是相同的。
接下來先回去看一下 JumpListItem,有如下成員:
Arguments 是引數,OnLaunched 中會獲取到這個值。
Description 這個就相當於 ToolTip,如下圖:
DisplayName 就是項顯示的名稱。
GroupName 就是這一項歸屬與哪一個組,如下圖:
如果 GroupName 為空字串就會被分配在“任務”這裡。
Kind 是一個只讀屬性,一個列舉型別:
指示這個 Item 是項還是分隔線。
Logo 這個很好懂,就是項前面那個小圖示。不過需要注意的是,僅支援 ms-appx:/// 和 ms-appdata:///local/ 這兩個協議,http:// 是不支援的,但我們可以把圖片下載下來嘛。
RemovedByUser 是一個只讀屬性,我們是沒法修改它的,根據 MSDN 的描述:https://msdn.microsoft.com/zh-cn/library/windows.ui.startscreen.jumplistitem.aspx (Remarks 部分),自定義組中的 Item 右鍵會有一個刪除的選項,此時這個屬性就會被系統設定為 true。
那麼使用者點選這個之後,這個 Item 就會從跳轉列表中消失。但是,也僅僅是使用者看不見,JumpList 例項中的 Item 還是存在,並且 RemovedByUser 是被設定為 true。這個時候我們程式猿就需要從 JumpList 中刪除掉這個 Item 了。
另外特別要注意的是,DisplayName、Description 和 GroupName 這三個屬性是支援本地化的。
假設在專案根目錄建立 Resources.resw 檔案,並假設有 LocalName 這麼一項,那麼可以將屬性值設定為 ms-resource:///Resources/LocalName。
Item 的成員就到此解釋完了。那接下來就把上面 JumpList 先忽略的 SystemGroupKind 屬性給說了。
根據 MSDN 的描述:https://msdn.microsoft.com/zh-cn/library/windows.ui.startscreen.jumplist.aspx (Example 部分)
假設 APP 關聯了檔案協議的話,APP 是會自動產生 JumpList 的。
而這個 SystemGroupKind 列舉屬性就是定義這個行為的,None 表示不自動產生,Frequent則表示最常用的檔案,Recent 則表示最近使用的檔案。預設的話是 Recent。
不過需要注意的是,這個屬於系統行為,自動產生的這些項是不包含在 JumpList 的 Item 中的,如果不需要系統提供的話,設定為 None 就好了。
本文就此結束,如果需要 Demo,可以去看微軟官方的 Demo:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/JumpList
JumpList 可以在檔案處理型的 APP 中使用(例如雲端記事本這種),或者取代二級磁貼(當然 JumpList 只能在 Desktop 上使用這點請注意)。希望大家能活用 JumpList 寫出優秀的 APP。