Оновлюємо Windows Phone Silverlight 8.0 додаток до Windows Phone Silverlight 8.1

    
Ми продовжуємо цикл статей, присвячених оновленню Windows Phone 8.0 додатків до версії 8.1. Сьогодні ми розглянемо нові можливості Silverlight 8.1 і процес оновлення додатків Windows Phone Silverlight 8.0 до версії 8.1.
 
 
Короткий огляд
Нова версія Windows Phone Silverlight 8.1 надає розробникам мобільних додатків доступ до функцій Windows Phone 8.1 WinRT без значної зміни коду існуючого Silverlight додатки.
 
Silverlight 8.1 є продовженням технології для розробників Silverlight.
 
Оновити додаток до Silverlight 8.1 дуже просто, використовуючи вбудований інструмент в Visual Studio 2013:
 
 
Необхідно врахувати, що Silverlight 8.1 додатки працюють тільки на Windows Phone 8.1 пристроях. Якщо потрібно підтримувати працездатність програми на минулих версіях операційних систем, то в магазині рекомендується поширювати так само і стару версію програми на Silverlight 8.0.
 
Якщо ви тільки починаєте розробку під Windows Phone і хотіли б мати версію програми і для ПК, то рекомендується почати розробку на новому Windows Phone 8.1 (WinRT або WinJS ), які надають можливості створення універсальних програм для телефонів, планшетів і ПК. На жаль, додаток на Silverlight 8.1 не вдасться розширити до універсального.
 
Як вибрати відповідну технологію для розробки свого мобільного додатку, можна прочитати тут .
 
 
Нові можливості Windows Phone Silverlight 8.1
Безліч інструментів і API, доступних для Silverlight 8.0 додатків, так само будуть доступні для Silverlight 8.1. Про деякі відмінностях у використанні описано в наступній статті .
 
Нижче перераховані деякі нові можливості, доступні для Silverlight 8.1 додатків:
 
     
  • Розширення API, тобто крім доступних в Silverlight 8.0 WinRT APIs при переході на Silverlight 8.1 так само стануть доступні і XAML 8.1 WinRT APIs;
  •  
  • Бонуси для графіки, тексту і т.д. з D2D/DWrite/WIC / ...;
  •  
  • Додаток на Silverlight 8.1 при необхідності зможе виступати в якості фото-провайдера;
  •  
  • Оновлена ​​«безшовна» інтеграція VoIP сервісу для ауді-відео дзвінків через інтернет;
  •  
Можливості, доступні тільки для Windows Phone 8.1 додатків, але так само підтримувані і для додатків Silverlight 8.1:
 
     
  • Нові інструменти для тестування додатка;
  •  
  • Робота з файлами;
  •  
  • Розширення можливостей зберігання, резервного копіювання, відновлення даних;
  •  
  • Підтримка карт SD;
  •  
  • Спільне використання даних між додатками;
  •  
  • Плитки, індикатори подій, Push-повідомлення за допомогою нового сервісу Windows Push Notification Service (WNS);
  •  
  • виполененія завдань і передача даних у фоновому режимі;
  •  
  • Створення мережних додатків і можливість єдиної авторизації на різних сервісах для користувачів, з використанням нової можливості зберігання аутентифікаційних даних користувача;
  •  
  • Підтримка Bluetooth і WiFi Direct сервісів, виявлення пристроїв;
  •  
  • Оновлення платіжних інструментів NFC;
  •  
  • Інтелектуальна панель введення;
  •  
  • Відправка листів і вкладень;
  •  
  • Доступ до контактів і календарем;
  •  
  • Датчики положення пристрою в просторі;
  •  
  • Географічне положення і геолокація;
  •  
  • Можливості роботи з фото, відео, аудіо матеріалами, збереження, редагування медіа контенту;
  •  
Більш докладний список та інформація про нові можливості в Silverlight 8.1 розташовані на MSDN .
 
 
Як оновити додаток з Windows Phone Silverlight 8.0 до Silverlight 8.1
Розглянемо процес оновлення додатка Windows Phone Silverlight 8.0 до 8.1 на наступному прикладі. Візьмемо контентне додаток — «Кулінарія книга». У ній по країнах розсортовані рецепти, кожен рецепт складається з декількох сторінок: опис, інгредієнти, фото. Додаток, крім відображення рецептів, дозволяє додавати фото власних страв і закріпити вподобаний рецепт на стартовому екрані телефону.
 
Що потрібно для розробки:
 Процес оновлення Silverlight 8.0 додатка до 8.1:
 
     
  1. Не забудьте зробити бекап портіруемость додатка;
  2.  
  3. Відкриваємо рішення (файл розширення. sln) в Visual Studio 2013;
  4.  
  5. Правою кнопкою миші викликати контекстне меню:
     
  6.  
  7. Далі натискаємо Yes:
     
  8.  
  9. Отримуємо в обзревателе Windows Phone Silverlight 8.1 рішення:
     
  10.  
Головна іконка на місці, але схоже що зображень для комфортної роботи оновленого додатка тепер потрібно набагато більше.
 
Детальніше про вимоги до зображень Windows Phone Silverlight 8.1 додатків написано в цій статті .
 
Вирішуємо цю проблему просто — створюємо необхідні зображення і поміщаємо їх в папку Assets поточного програми:
 
  
 
Тестуємо портоване додаток Windows Phone Silverlight 8.1
Запускаємо емулятор і відкриваємо додаток:
  
     
  • Список країн — Список рецептів для кожної країни — Рецепт:
     
  •  
  • Моделюємо ситуацію перемикання на інший додаток з поточного рецепта, наприклад на «Повідомлення»:
     
  •  
  • Повертаємося до додатка через меню:
     
  •  
  • Отримуємо помилку в поведінці додатки.
  •  
Додаток не відкрило нову копію раніше запущеного додатку, як це відбувалося в Silverlight 8.0, у разі c поверненням до роботи з додатком сталося таке: екран моргнув, додаток перекинуло користувача на стартову сторінку і перестало відображати будь-які дані, а очікувався запуск поточної копії додатку, на тому ж місці на якому воно було перервано.
 
Така поведінка пов'язана із зміною життєвого циклу Windows Phone додатки. Спробуємо це виправити.
 
 
Виправляємо недоліки в Портировать додатку
 
     
  1. У браузері рішень відкриваємо app.xaml.cs файл:
     
      
    Перевіримо FAR — Fast app resume (швидке відновлення роботи) можливість, яка дозволяє відкрити ту копію програми, розташованої в пам'яті.
     
    Тут в області Phone Application Initialization бачимо, що шаблони код FAR обробки доступний і все має працювати коректно:
     
    #region Phone application initialization
    
            // Avoid double-initialization
            private bool phoneApplicationInitialized = false;
    
            // Do not add any additional code to this method
            private void InitializePhoneApplication()
            {
                if (phoneApplicationInitialized)
                    return;
    
                // Create the frame but don't set it as RootVisual yet; this allows the splash
                // screen to remain active until the application is ready to render.
                RootFrame = new TransitionFrame();
                RootFrame.Navigated += CompleteInitializePhoneApplication;
    
                // Handle navigation failures
                RootFrame.NavigationFailed += RootFrame_NavigationFailed;
    
                // Handle reset requests for clearing the backstack
                RootFrame.Navigated += CheckForResetNavigation;
    
                // Ensure we don't initialize again
                phoneApplicationInitialized = true;
            }
    
            // Do not add any additional code to this method
            private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
            {
                // Set the root visual to allow the application to render
                if (RootVisual != RootFrame)
                    RootVisual = RootFrame;
    
                // Remove this handler since it is no longer needed
                RootFrame.Navigated -= CompleteInitializePhoneApplication;
            }
    
            private void CheckForResetNavigation(object sender, NavigationEventArgs e)
            {
                // If the app has received a 'reset' navigation, then we need to check
                // on the next navigation to see if the page stack should be reset
                if (e.NavigationMode == NavigationMode.Reset)
                    RootFrame.Navigated += ClearBackStackAfterReset;
            }
    
            private void ClearBackStackAfterReset(object sender, NavigationEventArgs e)
            {
                // Unregister the event so it doesn't get called again
                RootFrame.Navigated -= ClearBackStackAfterReset;
    
                // Only clear the stack for 'new' (forward) and 'refresh' navigations
                if (e.NavigationMode != NavigationMode.New && e.NavigationMode != NavigationMode.Refresh)
                    return;
    
                // For UI consistency, clear the entire page stack
                while (RootFrame.RemoveBackEntry() != null)
                {
                    ; // do nothing
                }
            }
    
            #endregion
    

    Перевіримо, що відбувається з відображенням даних.
  2.  
  3. Відкриваємо MainPage.xaml.cs і спостерігаємо наступне:
    У методі OnNavigatedTo перевіряється умова завантажений чи список рецептів зараз:
     
    protected override void OnNavigatedTo(…)
            {
                if (!App.Recipes.IsLoaded)
                {
                    pi = new Microsoft.Phone.Shell.ProgressIndicator();
                    pi.IsIndeterminate = true;
                    pi.Text = "Loading data, please wait...";
                    pi.IsVisible = true;
    
                    Microsoft.Phone.Shell.SystemTray.SetIsVisible(this, true);
                    Microsoft.Phone.Shell.SystemTray.SetProgressIndicator(this, pi);
    
                    App.Recipes.RecipesLoaded += Recipes_RecipesLoaded;
                    App.Recipes.LoadLocalDataAsync();
                }
                base.OnNavigatedTo(e);
            }
    
    

    При повторному виклику того ж додатка метод визначає список рецептів як уже завантажений і не виконує дій, заданих по цій умові.
    Додамо альтернативний варіант обробки умови:
      
    else
                    if (e.NavigationMode == NavigationMode.New)
                    {
                        lstGroups.DataContext = App.Recipes;
                    }
    
    

    Перевіряємо, для того щоб переконатися, що все працює вірно.
  4.  
  5. Виявилися помилки при відкритті файлів, що відповідають за інтерфейс програми.
    Відкриємо будь-який файл, наприклад MainPage.xaml, і отримуємо відсутність відображення елементів в дизайнера:
      
     
    Щоб вирішити проблему з дизайнером форми, необхідно звернути увагу на наступну помилку:
     The member «Instance» is not recognized or is not accessible.
    Помилка означає що властивість більше не підтримується.
     
    Далі в тексті файлу знаходимо рядок:
     
    <Grid x:Name="LayoutRoot" Background="Transparent" d:DataContext="{d:DesignData /SampleData/RecipeDataSourceSampleData.xaml, Instance={x:Null}}">
    

     Наводимо її до такого виду:
     
    <Grid x:Name="LayoutRoot" Background="Transparent" d:DataContext="{d:DesignData /SampleData/RecipeDataSourceSampleData.xaml}">
    

    Візуальний конструктор в порядку:
     
  6.  
Так само компілятор повідомляє про помилки, пов'язаних з остуствіем toolkit елменти:
 
 
Нова платформа WinRT включає як старі елементи управління, так і безліч нових. Тому бібліотека Windows Phone Toolkit більше не потрібна для мобільних додатків. Закомментіруем або замінимо їх на нові аналоги.
 
Зверніть увагу, при оновленні програми на відмінності в namespace і класах.
 
Наприклад, у цьому додатку використовувався клас ListView, якого більше не існує в Windows Phone Silverlight 8.1 і його в додатку ми замінили на ListBox.
Клас LongListSelector так само більше не підтримується, і ми використовуємо варіант його заміни:
Було:
 
<phone:LongListSelector x:Name="IngredientsListBox" ItemsSource="{Binding Ingredients}"/>

Стало:
 
<ListBox x:Name="IngredientsListBox" ItemsSource="{Binding Ingredients}" >
     <StackPanel Margin="12,0,0,0">
        <TextBlock Text="{Binding Mode=OneWay}" Margin="0,0,0,12"/>
      </StackPanel>
 </ListBox>

 
 
Додаємо нові можливості
Одна з нових можливостей для Silverlight 8.1 — це здатність обмінюватися даними з іншими додатками, в тому числі зображеннями.
 
Наше додаток може створювати і зберігати фотографії приготованого блюда, спробуємо навчити його «ділитися», використовуючи нові можливості API:
 
     
  1. У браузері рішень відкриємо RecipeDetailPage.xaml файл:
     
     
  2.  
  3. Для елемента Application Bar додамо нову кнопку «Share»:
     
       
    • Використовуючи вікно властивостей (Properties) для ApplicationBar, знайдемо колекцію кнопок Buttons, додамо кнопку AppBarButton, виберемо стандартну іконку icon = share.png і вкажемо її назва text = "share":
       
    •  
    • Створимо і напишемо обробник для кнопки «Share»:
        
      private void ShareButton_Click(object sender, EventArgs e)</li>
      	 {
      	          if (item.UserImages == null || item.UserImages.Count == 0)
      	           {
      	                MessageBox.Show("You must take a picture first!");
      	           }
      	            else
      	            {
      	               DataTransferManager.ShowShareUI();
      	            } 
      	    }
      
    •  
     
  4.  
  5. У методі OnNavigatedTo, додамо подія DataRequested:
     
    protected async override void OnNavigatedTo(NavigationEventArgs e)
    {
       ...
       DataTransferManager.GetForCurrentView().DataRequested += RecipeDetailPage_DataRequested;
    
       base.OnNavigatedTo(e);
    } 
    

    Створимо функцію для обробки цієї події:
     
    async void RecipeDetailPage_DataRequested (DataTransferManager sender, DataRequestedEventArgs args)
    
  6.  
  7. Створимо і перевизначити метод OnNavigatedFrom:
     
    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        DataTransferManager.GetForCurrentView().DataRequested -= RecipeDetailPage_DataRequested;
    }
    
  8.  
  9. Додамо код у функцію RecipeDetailPage_DataRequested для обробки події DataRequested:
     
    {
                DataRequest request = args.Request;
                var deferral = args.Request.GetDeferral();
    
                try
                {
                    Uri photoFileUri = new Uri("ms-appdata:///local/" + item.UserImages[0]);
                    var photoFile = await StorageFile.GetFileFromApplicationUriAsync(photoFileUri);
    
                    request.Data.Properties.Title = "I've been baking!";
                    request.Data.Properties.Description = "This was my attempt at making " + item.ShortTitle;
    
                    // It's recommended to use both SetBitmap and SetStorageItems for sharing a single image
                    // since the target app may only support one or the other.
                    List<IStorageItem> imageItems = new List<IStorageItem>();
                    imageItems.Add(photoFile);
                    request.Data.SetStorageItems(imageItems);
    
                    RandomAccessStreamReference imageStreamRef = RandomAccessStreamReference.CreateFromFile(photoFile);
                    // It is recommended that you always add a thumbnail image any time you're sharing an image
                    request.Data.Properties.Thumbnail = imageStreamRef;
                    request.Data.SetBitmap(imageStreamRef);
    
                    // Set Text to share for those targets that can't accept images
                    request.Data.SetText("I just made " + item.ShortTitle + " from Contoso Cookbook!");
                }
                finally
                {
                    deferral.Complete();
    }
    

    Щоб у коді працювали всі використовувані функції, підключимо:
     
    using Windows.ApplicationModel.DataTransfer;
    using Windows.Storage;
    using Windows.Storage.Streams;
    

     
  10.  
  11. Перевіряємо наші нововведення. Відкриваємо додаток. Відтворюємо процес створення фотографії та натискаємо кнопку «Share»:
     
     
    Відкриваються сервіси, в яких можна поділитися фотографією.
  12.  
 
Висновок
Silverlight 8.1 є не тільки продовженням попередньої версії Silverlight 8.0, але так само поєднує в собі нові можливості, які пропонує технологія Windows Phone 8.1 і WinRT. А перехід на Silverlight 8.1 з додатків попередньої версії не є довгим і трудомістким процесом.
 
 
Корисні посилання
 Tutorial: Building Apps for windows Phone 8.1
 MSDN Library: Supported features for Windows Phone Silverlight 8.1 apps
 Навчальні курси віртуальної академії Microsoft (MVA)
 Завантажити безкоштовну або пробну Visual Studio 2013
 Стати розробником додатків Windows Phone
 Завантажити приклад програми на Silverlight 8.1 з цієї статті
 Завантажити приклади коду з основними можливостями Windows Phone 8.1 (c #, c + +, javascript)
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.