Добавление jump lists в приложение UWP

от автора

Jump lists были и остаются частью классических приложений Windows, позволяя перейти к различному функционалу приложения. Например, открыть последний файл или запустить приложение с активированной фичей.
Приложения UWP позволяют нам использовать аналогичный функционал, реализуемый в виде дополнительных пунктов контекстного меню панели задач или плитки стартового экрана.

JumpList недоступны в ранних сборках 10-ки. Поэтому первым делом обновляем систему и SDK. Я обновился до 10.0.10586
Открываем App.xaml.cs и добавляем такой вот Task:

        public static async Task SetupJumpList()         {          JumpList jumpList = await JumpList.LoadCurrentAsync();          jumpList.Items.Clear();           JumpListItem photoItem = JumpListItem.CreateWithArguments("photo", "фото");          photoItem.Logo = new Uri("ms-appx:///Assets/photo.png");          JumpListItem videoItem = JumpListItem.CreateWithArguments("video", "видео");          videoItem.Logo = new Uri("ms-appx:///Assets/video.png");           jumpList.Items.Add(photoItem);          jumpList.Items.Add(videoItem);           await jumpList.SaveAsync();         } 

Добавляем необходимые пространства имен:

using System.Threading.Tasks; using Windows.UI.StartScreen; 

В свойствах проекта можно посмотреть минимальную версию целевой платформы. Если она довольно ранняя, то код внутри нашего Task-а необходимо будет обернуть в try-catch.
Взглянув на код, вы можете заметить, что он использует файлы photo.png и video.png из папки Assets. Эти файлы значков необходимо добавить в приложение.
Вызвать Task и зарегистрировать контекстное меню JumpList можно в любой момент. Давайте сделаем это в событии OnLaunched(LaunchActivatedEventArgs e).

await SetupJumpList(); 

В этом же событии OnLaunched можно определить было ли приложение открыто через пункт JumpList или же было открыто обычным способом. Аргумент LaunchActivatedEventArgs e содержит в себе необходимую информацию. Если его значением является «photo», то это значит, что приложение было открыто по контекстной ссылке «фото».
Вот такое меню у меня получилось:

Мне захотелось сделать так, чтобы при выборе пункта видео или фото переход происходил не на MainPage, а на какую-то другую страничку. Для этого первым делом создадим эту другую страничку. Я создал страницу с именем PhotoPage.xaml
Содержимое ее сделал довольно простым:

<Page     x:Class="JumpListsDemo.PhotoPage"     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     xmlns:local="using:JumpListsDemo"     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"     mc:Ignorable="d">          <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">         <Image x:Name="imgPhoto" Width="auto" Height="auto"></Image>         <TextBlock FontSize="28" HorizontalAlignment="Center">Страничка с фото</TextBlock>     </Grid> </Page> 

Отловим каким образом было открыто приложение и сделаем переход на страничку PhotoPage. Для этого, в App.xaml.cs нужно найти внутри метода OnLaunched код:

rootFrame.Navigate(typeof(MainPage), e.Arguments); 

и заменить его на что-то вроде:

      if (e.Arguments == "photo")    {       rootFrame.Navigate(typeof(PhotoPage), e.Arguments);    }       else    {       rootFrame.Navigate(typeof(MainPage), e.Arguments);    } 

Вуаля. При выборе через контекстное меню пункта «фото» нам будет открываться страничка с видео. Сделать переход по пункту «видео» можно через else if, либо заменив всю конструкцию на switch.

Коротенькая статья получилась, правда? Давайте бонусом вкратце рассмотрим, как можно запомнить последний открытый файл и добавить ссылку на него в JumpList.
Допустим где-то в программе мы открываем файл с помощью FileOpenPicker.

  FileOpenPicker filePicker = new FileOpenPicker();   filePicker.FileTypeFilter.Add(".jpg");   filePicker.ViewMode = PickerViewMode.List;   filePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;   filePicker.SettingsIdentifier = "picker1";   Windows.Storage.StorageFile f = await filePicker.PickSingleFileAsync(); 

Теперь в случае если файл был выбран мы сделаем с ним что хотели, и после запишем его в список последних посещенных файлов:

            if (f != null)             {              // делаем что нам нужно и…..              // записываем файл в последние использованные             String mruToken = MostRecentlyUsedList.Add(f, f.Name);             } 

В UWP точно так же как и в приложениях Windows 8.x особые правила доступа к файлам. Если в манифесте прописаны разрешения, то может быть получен доступ к папкам/библиотекам изображений, музыки, видео. Для того чтобы получить доступ к другим файлам необходимо чтобы пользователь выбрал их с помощью File- или Folder- Picker-a. Ну и чтобы после перезапуска приложения разрешение доступа к содержимому файла не терялось, нужно использовать свойство MostRecentlyUsedList класса Windows.Storage.AccessCache.StorageApplicationPermissions. А значит в код должно быть добавлено пространство имен:

using Windows.Storage.AccessCache.StorageApplicationPermissions; 

Немного изменим наш первый пример. Перенесем регистрацию на экране блокировки из OnLaunched в код который открывает файл. В конец if только что упомянутого кода добавим

await App.SetupJumpList(f); 

Кстати, SetupJumpList тоже изменим:

public static async Task SetupJumpList(Windows.Storage.StorageFile fl)         {                 JumpList jumpList = await JumpList.LoadCurrentAsync();                 jumpList.Items.Clear();                 JumpListItem lastItem = JumpListItem.CreateWithArguments("lastfile", fl.DisplayName);                 lastItem.Logo = new Uri("ms-appx:///Assets/photo.png");                 jumpList.Items.Add(lastItem);                 await jumpList.SaveAsync();         } 

Внесем изменения в OnLaunched

      if (e.Arguments == "lastfile")    {       rootFrame.Navigate(typeof(PhotoPage), e.Arguments);    }       else    {       rootFrame.Navigate(typeof(MainPage), e.Arguments);    } 

Теперь осталось только при навигации на страницу PhotoPage обработать аргумент, который передается в качестве параметра вызовом

      rootFrame.Navigate(typeof(PhotoPage), e.Arguments); 

Этот аргумент как видно передается из App.xaml.cs в страницу PhotoPage. Отловить его можно в событии OnNavigatedTo. Код который необходимо добавить в PhotoPage такой:

        protected  override async void OnNavigatedTo(NavigationEventArgs e)         {             try             {                 Windows.Storage.StorageFile f;                 String mruFirstToken = MostRecentlyUsedList.Entries.FirstOrDefault().Token;                 f = await MostRecentlyUsedList.GetFileAsync(mruFirstToken);                 SetPhoto(f);             }catch{}         }          public async void SetPhoto(StorageFile storageFile)         {             BitmapImage image = new BitmapImage();             IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read);             image.SetSource(stream);             imgPhoto.Source = image;         } 

Пример готов. После того как пользователь выберет файл изображения, название файла появится в контекстном меню, вызываемом на плитке. После выбора этого пункта контекстного меню приложение будет открыто на странице PhotoPage и изображение будет выведено на экран.

Написано по мотивам:
Developing for Windows 10 – Implementing jump lists
UWP Quick tip – JumpLists

ссылка на оригинал статьи http://habrahabr.ru/post/272613/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *