1. 程式人生 > >【Win10】探索 Windows 10 10586 之 JumpList(跳轉列表)

【Win10】探索 Windows 10 10586 之 JumpList(跳轉列表)

原文: 【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 工程,然後在專案上右鍵 → 屬性。

QQ截圖20151211225910

或許有些小夥伴還是分不清這兩個的含義和區別,這裡我稍微說明下:

目標版本是指你能使用的 API 的版本,JumpList 這個 API 是 10586 的,因此這裡如果你選擇的是 10240 就沒法用了。

而最低版本則是使用者能安裝你這個 APP 的版本,只有等於或高於的使用者才能安裝。

那麼你又會問了,像上面圖片這樣的,10240 的使用者安裝了這個 APP,然後執行到 10586 的 API 的程式碼會怎樣。答案就是會產生一個異常,但是,微軟也給出了相應的解決方案,那就是在呼叫這些 API 之前先檢查是不是能用,這個類就是

ApiInformation

由於 ApiInformation 類的方法的引數都是字串形式的,我們很容易敲錯,因此在這裡,我先強烈推薦一個程式碼分析器!!!

https://www.nuget.org/packages/PlatformSpecific.Analyzer/

程式碼分析器是 VS 2015 的新功能,是基於 roslyn 的,roslyn 這個東西比較複雜,這裡我就不班門弄斧了。像一般的 nuget 包那樣安裝就行了。

安裝完之後是這樣的:

QQ截圖20151211231234

 

在 MSDN 上我們可以看到,JumpList 目前是隻支援 Desktop 的,IsSupported 正是為了檢測這個。

https://msdn.microsoft.com/zh-cn/library/mt608936(v=win.10).aspx

那麼寫下如下程式碼:

QQ截圖20151211231719

可以看見程式碼被標註了綠色的波浪線,這個就是我前面為什麼要安裝分析器的原因。然後點選小燈泡後選擇第一項。程式碼就會變成下面那樣:

QQ截圖20151211231924

此時波浪線也消失了,這樣 10240 的機器就不會呼叫到裡面程式碼,而 10586 或以上的機器就能呼叫到裡面的程式碼。

接下來我們可以呼叫 JumpList 的 LoadCurrentAsync 方法來讀取該 APP 的跳轉列表。

QQ截圖20151211232204

然後可以獲取到 JumpList 的例項了。

JumpList 類有三個例項成員:

QQ截圖20151211232552

Items 屬性是指裡面的項,SaveAsync 方法一眼就看出是儲存。SystemGroupKind 我先不管放一邊,最後再管它。

然後對 Items 屬性操作一下,最後呼叫儲存:

QQ截圖20151211233453

執行之後,工作列:

QQ截圖20151211233258

開始選單:

QQ截圖20151211233349

開始螢幕(也就是開始選單右側磁貼部分):

QQ截圖20151211233429

然後斷點 App.xaml.cs 之後,點選 JumpList 的測試這個項後會觸發 OnLaunched 方法。

QQ截圖20151211233750

所以在 OnLaunched 裡面處理 JumpList 傳遞過來的引數跟二級磁貼的方式是相同的。

 

接下來先回去看一下 JumpListItem,有如下成員:

QQ截圖20151211234153

Arguments 是引數,OnLaunched 中會獲取到這個值。

Description 這個就相當於 ToolTip,如下圖:

QQ截圖20151211234920

DisplayName 就是項顯示的名稱。

GroupName 就是這一項歸屬與哪一個組,如下圖:

QQ截圖20151211235128

如果 GroupName 為空字串就會被分配在“任務”這裡。

Kind 是一個只讀屬性,一個列舉型別:

QQ截圖20151211235458

指示這個 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。

QQ截圖20151212000349

那麼使用者點選這個之後,這個 Item 就會從跳轉列表中消失。但是,也僅僅是使用者看不見,JumpList 例項中的 Item 還是存在,並且 RemovedByUser 是被設定為 true。這個時候我們程式猿就需要從 JumpList 中刪除掉這個 Item 了。

另外特別要注意的是,DisplayNameDescriptionGroupName 這三個屬性是支援本地化的。

假設在專案根目錄建立 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。