Добавление 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

    Комментарии 2

      0
      Удивительно что у такой статьи вообще нет комментариев.

      У меня вопрос, а возможно как-то сделать powershell скрипт с поддержкой джамплистов?
        0
        Вопрос скорее для stackoverflow. Powershell скрипт это скорее файл, чем приложение. Если как-то сможете разместить на стартовом экране, то думаю, что сможете и джамп-листы добавить. Возможно, что через реестр это как-то делается

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое