<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Разработка приложений на платформе Microsoft</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/apps/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/apps/feed.xml</link>
    <description>Всё о разработке для Windows Phone, Windows и кроссплатформенной разработке на технологиях Microsoft</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:14:24 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Используем AngularJS в Windows Phone 8.1 приложениях</title>
      <link>https://docs.microsoft.com/archive/blogs/apps/angularjs-windows-phone-8-1</link>
      <pubDate>Wed, 05 Nov 2014 17:08:00 GMT</pubDate>
      <dc:creator><![CDATA[Татьяна Сметанина]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/apps/2014/11/05/angularjs-windows-phone-8-1/</guid>
      <description><![CDATA[В этом посте я расскажу вам как подключить и начать использовать популярный JavaScript...]]></description>
      <content:encoded><![CDATA[<p><img src="https://habrastorage.org/files/e23/ce4/b16/e23ce4b166084b488385a349907a04cc.PNG" alt="" /><br /><br /><span>В этом посте я расскажу вам как подключить и начать использовать популярный JavaScript фреймворк&nbsp;</span><a href="https://angularjs.org/">AngularJS</a><span>&nbsp;для разработки приложений для Windows Phone 8.1. Вы сможете подключить&nbsp;</span><a href="https://angularjs.org/">AngularJS</a><span>&nbsp;к своему проекту и начать использовать его возможности.</span><br /><a name="habracut"></a></p>
<h1>Создаем проект и подключаем AngularJs</h1>
<p><br /><span>Создаем новый проект для Windows Phone 8.1 на JavaScript по шаблону&nbsp;</span><strong>Blank App</strong><span>.</span><br /><br /><img src="https://habrastorage.org/files/4bf/2b4/446/4bf2b4446ef246ea85c075de373716da.png" alt="" /><br /><br /><span>Подключаем&nbsp;</span><a href="https://angularjs.org/">AngularJS</a><span>. Он доступен в виде установочного пакета в&nbsp;</span><strong>NuGet</strong><span>.&nbsp;</span><br /><span>Открываем&nbsp;</span><strong>NuGet Package Manager Console</strong><span>&nbsp;и выполняем команды:</span><br /><br /></p>
<pre><code class="bash">install-package AngularJS.Core install-package AngularJS.Animate install-package Angular.UI.UI-Router </code></pre>
<p><br /><em>AngularJS.Core</em><span>&nbsp;&ndash; библиотека с базовыми возможностями AngularJS.&nbsp;</span><br /><br /><em>AngularJS.Animate</em><span>&nbsp;&ndash; анимационные возможности.&nbsp;</span><br /><br /><em>Angular.UI.UI-Router</em><span>&nbsp;&ndash; навигация, работа с представлениями.</span><br /><br /><em>Angular-WinJS</em><span>&nbsp;&mdash; чтобы получить возможность использовать AngularJS вместе с WinJS, вам нужно установить этот модуль. К сожалению, в настоящее время он не опубликован в виде пакета NuGet и нам придется&nbsp;</span><a href="https://raw.githubusercontent.com/codemonkeychris/angular-winjs/master/js/angular-winjs.js">скачать</a><span>&nbsp;его с GitHub вручную.&nbsp;</span><br /><br /><span>Добавьте скачанный скрипт в папку&nbsp;</span><strong>scripts</strong><span>&nbsp;в проекте:</span><br /><br /><img src="https://habrastorage.org/files/ac2/8f8/1a1/ac28f81a1985496d92efa1cfa9784190.PNG" alt="" /><br /><br /></p>
<h1>Вносим изменения в библиотеки</h1>
<p><br /><span>Как только вы попробуете подключить библиотеки Angular на вашу страницу и запустить приложение, произойдет страшное, то есть ошибка.&nbsp;</span><br /><br /><img src="https://habrastorage.org/files/db9/63f/45e/db963f45e03f4491abe8961743c60bf5.png" alt="" /><br /><br /><span>В соответствии с моделью безопасности Windows Phone приложений, вы не можете динамически менять содержимое элементов страницы. Но можете это делать внутри конструкции</span><br /><br /></p>
<pre><code class="javascript">MSApp.execUnsafeLocalFunction(<span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">()</span></span> {</span></span> }); </code></pre>
<p><br /><br /><span>То есть, в файле&nbsp;</span><strong>scripts/angular.js</strong><span>&nbsp;необходимо обернуть все изменения&nbsp;</span><strong>innerHTML</strong><span>&nbsp;или вызовы метода&nbsp;</span><strong>prepend</strong><span>&nbsp;или&nbsp;</span><strong>insert..</strong><span>&nbsp;в эту конструкцию.</span><br /><br /><span>Исправленный файл доступен&nbsp;</span><a href="https://github.com/MissUFO/AngularJs">по ссылке</a><span>&nbsp;на Github</span><br /><br /></p>
<h1>Используем AngularJS на странице приложения</h1>
<p><br /><span>1. Откроем файл&nbsp;</span><strong>default.html</strong><span>, добавим ссылки на библиотеки AngularJS.</span><br /><br /><img src="https://habrastorage.org/files/10f/a1e/772/10fa1e77263c4971b32cb01a984c6176.png" alt="" /><br /><br /><span>В теле страницы разместим специальный контейнер, в который средствами AngularJS мы будем загружать представление:</span><br /><br /></p>
<pre><code class="html xml"><span class="tag">&lt;<span class="title"><span class="title">div</span></span> <span class="attribute"><span class="attribute">ui-view</span></span>&gt;</span><span class="tag">&lt;/<span class="title"><span class="title">div</span></span>&gt;</span> </code></pre>
<p>&nbsp;</p>
<div class="spoiler spoiler_open"><span class="spoiler_title">Полный код файла default.html</span>
<div class="spoiler_text">
<pre><code class="html xml"><span class="doctype">&lt;!DOCTYPE html &gt;</span> <span class="tag">&lt;<span class="title"><span class="title">html</span></span>&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">head</span></span>&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">meta</span></span> <span class="attribute"><span class="attribute">charset</span></span>=<span class="value"><span class="value">"utf-8"</span></span> /&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">title</span></span>&gt;</span>demo<span class="tag">&lt;/<span class="title"><span class="title">title</span></span>&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">link</span></span> <span class="attribute"><span class="attribute">href</span></span>=<span class="value"><span class="value">"//Microsoft.Phone.WinJS.2.1/css/ui-light.css"</span></span> <span class="attribute"><span class="attribute">rel</span></span>=<span class="value"><span class="value">"stylesheet"</span></span> /&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">script</span></span> <span class="attribute"><span class="attribute">src</span></span>=<span class="value"><span class="value">"//Microsoft.Phone.WinJS.2.1/js/base.js"</span></span>&gt;</span><span class="tag"><span class="tag">&lt;/<span class="title"><span class="title">script</span></span>&gt;</span></span> <span class="tag">&lt;<span class="title"><span class="title">script</span></span> <span class="attribute"><span class="attribute">src</span></span>=<span class="value"><span class="value">"//Microsoft.Phone.WinJS.2.1/js/ui.js"</span></span>&gt;</span><span class="tag"><span class="tag">&lt;/<span class="title"><span class="title">script</span></span>&gt;</span></span> <span class="comment">&lt;!-- Angular references --&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">script</span></span> <span class="attribute"><span class="attribute">src</span></span>=<span class="value"><span class="value">"/scripts/angular.js"</span></span>&gt;</span><span class="tag"><span class="tag">&lt;/<span class="title"><span class="title">script</span></span>&gt;</span></span> <span class="tag">&lt;<span class="title"><span class="title">script</span></span> <span class="attribute"><span class="attribute">src</span></span>=<span class="value"><span class="value">"/scripts/angular-animate.js"</span></span>&gt;</span><span class="tag"><span class="tag">&lt;/<span class="title"><span class="title">script</span></span>&gt;</span></span> <span class="tag">&lt;<span class="title"><span class="title">script</span></span> <span class="attribute"><span class="attribute">src</span></span>=<span class="value"><span class="value">"/scripts/angular-ui-router.js"</span></span>&gt;</span><span class="tag"><span class="tag">&lt;/<span class="title"><span class="title">script</span></span>&gt;</span></span> <span class="tag">&lt;<span class="title"><span class="title">script</span></span> <span class="attribute"><span class="attribute">src</span></span>=<span class="value"><span class="value">"/scripts/angular-winjs.js"</span></span>&gt;</span><span class="tag"><span class="tag">&lt;/<span class="title"><span class="title">script</span></span>&gt;</span></span> <span class="comment">&lt;!-- demo references --&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">link</span></span> <span class="attribute"><span class="attribute">href</span></span>=<span class="value"><span class="value">"/css/default.css"</span></span> <span class="attribute"><span class="attribute">rel</span></span>=<span class="value"><span class="value">"stylesheet"</span></span> /&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">script</span></span> <span class="attribute"><span class="attribute">src</span></span>=<span class="value"><span class="value">"/js/default.js"</span></span>&gt;</span><span class="tag"><span class="tag">&lt;/<span class="title"><span class="title">script</span></span>&gt;</span></span> <span class="tag">&lt;/<span class="title"><span class="title">head</span></span>&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">body</span></span> <span class="attribute"><span class="attribute">class</span></span>=<span class="value"><span class="value">"phone"</span></span> &gt;</span> <span class="tag">&lt;<span class="title"><span class="title">div</span></span> <span class="attribute"><span class="attribute">ui-view</span></span>&gt;</span><span class="tag">&lt;/<span class="title"><span class="title">div</span></span>&gt;</span> <span class="tag">&lt;/<span class="title"><span class="title">body</span></span>&gt;</span> <span class="tag">&lt;/<span class="title"><span class="title">html</span></span>&gt;</span> </code></pre>
</div>
</div>
<p><br /><span>2. Создадим новую папку&nbsp;</span><strong>views</strong><span>&nbsp;в который мы будем хранить представления для страниц.</span><br /><span>3. В папке</span><strong>&nbsp;views</strong><span>&nbsp;создадим файл&nbsp;</span><strong>mainView.html</strong><span>&nbsp;для представления главной страницы.&nbsp;</span><br /><span>Наша основная страница будет содержать только поздравление с прошедшим праздником и кнопку на панели действий.</span><br /><br /><img src="https://habrastorage.org/files/d40/6f1/254/d406f12540f34c27b8638ac10660e38a.png" alt="" /><br /><br /></p>
<div class="spoiler spoiler_open"><span class="spoiler_title">Полный код файла mainView.html</span>
<div class="spoiler_text"><br />
<pre><code class="html django"><span class="tag">&lt;<span class="title"><span class="title">div</span></span> <span class="attribute"><span class="attribute">class</span></span>=<span class="value"><span class="value">"demoView fragment"</span></span>&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">h1</span></span> <span class="attribute"><span class="attribute">style</span></span>=<span class="value"><span class="value">"font-size:2em"</span></span>&gt;</span> <span class="variable">{{greeting}}</span> <span class="tag">&lt;/<span class="title"><span class="title">h1</span></span>&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">win-app-bar</span></span>&gt;</span> <span class="tag">&lt;<span class="title"><span class="title">win-app-bar-command</span></span> <span class="attribute"><span class="attribute">icon</span></span>=<span class="value"><span class="value">"'accept'"</span></span> <span class="attribute"><span class="attribute">label</span></span>=<span class="value"><span class="value">"'ok'"</span></span> <span class="attribute"><span class="attribute">ng-click</span></span>=<span class="value"><span class="value">"ok()"</span></span>&gt;</span><span class="tag">&lt;/<span class="title"><span class="title">win-app-bar-command</span></span>&gt;</span> <span class="tag">&lt;/<span class="title"><span class="title">win-app-bar</span></span>&gt;</span> <span class="tag">&lt;/<span class="title"><span class="title">div</span></span>&gt;</span> </code></pre>
</div>
</div>
<p><br /><span>Конструкция&nbsp;</span><strong>{{greeting}}</strong><span>&nbsp;поможет нам вывести значение переменной, которую мы определим в контроллере, а кнопка подтверждения будет представлять собой кнопку на панели действий, созданную средствами WinJS.</span><br /><br /><span>4. Откроем</span><strong>&nbsp;js/default.js</strong><span>&nbsp;&ndash; основной файл приложения, в котором будет находиться весь код и заменим его содержимое.</span><br /><br /><img src="https://habrastorage.org/files/b57/f86/0af/b57f860affea4cf8964c20803314ba42.png" alt="" /><br /><br /></p>
<div class="spoiler spoiler_open"><span class="spoiler_title">Полный код файла default.js</span>
<div class="spoiler_text">
<pre><code class="javascript"> (<span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">()</span></span> {</span></span> <span class="string">"use strict"</span>; <span class="keyword">var</span> app = WinJS.Application; <span class="keyword">var</span> activation = Windows.ApplicationModel.Activation; <span class="keyword">var</span> angular_app = angular.module(<span class="string">'demo'</span>, [<span class="string">'ui.router'</span>, <span class="string">'ngAnimate'</span>, <span class="string">'winjs'</span>]); app.onactivated = <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(args)</span></span> {</span></span> <span class="keyword">if</span> (args.detail.kind === activation.ActivationKind.launch) { <span class="keyword">if</span> (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) { } <span class="keyword">else</span> { } <span class="keyword">var</span> angularLoadedSignal = <span class="keyword">new</span> WinJS._Signal(); angular.element(document).ready(<span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">()</span></span> {</span></span> <span class="keyword">try</span> { angular.bootstrap(document, [<span class="string">'demo'</span>]); angularLoadedSignal.complete(); } <span class="keyword">catch</span> (e) { <span class="keyword">if</span> (!(<span class="keyword">typeof</span> e.message == <span class="string">'string'</span> || e.message <span class="keyword">instanceof</span> String)) { <span class="keyword">throw</span> e; } <span class="keyword">if</span> (e.message.indexOf(<span class="string">'[ng:btstrpd]'</span>) !== <span class="number">0</span>) { <span class="keyword">throw</span> e; } } }); args.setPromise(angularLoadedSignal.promise); } }; app.oncheckpoint = <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(args)</span></span> {</span></span> }; <span class="comment">//наполняем представление данными и обрабатываем события</span> angular_app.controller(<span class="string">'mainViewCtrl'</span>, [<span class="string">'$scope'</span>, <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">($scope)</span></span> {</span></span> $scope.greeting = <span class="string">'С Днем народного единства!'</span>; $scope.ok = <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">()</span></span> {</span></span> <span class="keyword">var</span> msgpopup = <span class="keyword">new</span> Windows.UI.Popups.MessageDialog(<span class="string">"Если вы хотите закрыть окно, нажмите на кнопку"</span>,<span class="string">"Отправить поздравление"</span>); msgpopup.commands.append(<span class="keyword">new</span> Windows.UI.Popups.UICommand(<span class="string">"ok"</span>, <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">()</span></span> {</span></span> })); msgpopup.showAsync(); }; }]); <span class="comment">//настраиваем, указываем шаблон и контроллер</span> angular_app.config(<span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">($stateProvider)</span></span> {</span></span> $stateProvider .state(<span class="string">'mainView'</span>, { url: <span class="string">'/mainView'</span>, templateUrl: <span class="string">'/views/mainView.html'</span>, controller: <span class="string">'mainViewCtrl'</span>, }); }); <span class="comment">//переходим на view при открытии приложения</span> angular_app.constant(<span class="string">'homeStateName'</span>, <span class="string">'mainView'</span>); angular_app.run(<span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(navigationSvc)</span></span> {</span></span> navigationSvc.goHome(); }); (<span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">()</span></span> {</span></span> <span class="keyword">var</span> NavigationSvc = <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">($q, $state, adapterSvc, homeStateName)</span></span> {</span></span> WinJS.Navigation.addEventListener(<span class="string">'navigating'</span>, <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(args)</span></span> {</span></span> <span class="keyword">var</span> targetState = args.detail.location; <span class="keyword">var</span> angularPromise = $state.go(targetState, args.detail.state); args.detail.setPromise(adapterSvc.toWinJSPromise(angularPromise)); }); <span class="keyword">this</span>.goHome = <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">()</span></span> {</span></span> <span class="keyword">return</span> adapterSvc.toAngularPromise(WinJS.Navigation.navigate(homeStateName)); }; <span class="keyword">this</span>.navigateTo = <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(view, initialState)</span></span> {</span></span> <span class="keyword">return</span> adapterSvc.toAngularPromise(WinJS.Navigation.navigate(view, initialState)); }; <span class="keyword">this</span>.goBack = <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">()</span></span> {</span></span> <span class="keyword">return</span> adapterSvc.toAngularPromise(WinJS.Navigation.back()); }; <span class="keyword">this</span>.goForward = <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">()</span></span> {</span></span> <span class="keyword">return</span> adapterSvc.toAngularPromise(WinJS.Navigation.forward()); } }; angular_app.service(<span class="string">'navigationSvc'</span>, NavigationSvc); }()); angular_app.service(<span class="string">'adapterSvc'</span>, [<span class="string">'$q'</span>, <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">($q)</span></span> {</span></span> <span class="keyword">return</span> { toAngularPromise: <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(winjsPromise)</span></span> {</span></span> <span class="keyword">var</span> deferred = $q.defer(); winjsPromise.then(<span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(value)</span></span> {</span></span> deferred.resolve(value); }, <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(err)</span></span> {</span></span> deferred.reject(err); }, <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(value)</span></span> {</span></span> deferred.notify(value); }); <span class="keyword">return</span> deferred.promise; }, toWinJSPromise: <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(angularPromise)</span></span> {</span></span> <span class="keyword">var</span> signal = <span class="keyword">new</span> WinJS._Signal(); angularPromise.then(<span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(value)</span></span> {</span></span> signal.complete(value); }, <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(err)</span></span> {</span></span> signal.error(err); }, <span class="function"><span class="keyword"><span class="function"><span class="keyword">function</span></span></span><span class="function"> <span class="params"><span class="params">(value)</span></span> {</span></span> signal.progress(value); }); <span class="keyword">return</span> signal.promise; } } }]); app.start(); })(); </code></pre>
</div>
</div>
<p><br /><span>В этом коде мы:</span></p>
<ul>
<li>Инициализируем библиотеки AngularJS и заставляем выполниться механизм bootstrap при загрузке страницы приложения. Подробнее как работает bootstrap в AngularJS описано в&nbsp;<a href="https://docs.angularjs.org/guide/bootstrap">руководстве</a>.</li>
<li>Создаем&nbsp;<a href="https://docs.angularjs.org/guide/controller">контроллер</a>&nbsp;<strong>demoViewCtrl</strong>, в котором создаем переменную и обрабатываем событие нажатия на кнопку на панели действий</li>
<li>Реализуем навигацию и загрузку представления в контейнер.<br />
<div class="spoiler spoiler_open"><span class="spoiler_title">Некоторые детали про навигацию</span>
<div class="spoiler_text">Как вы знаете, в WinJS есть своя библиотека для навигации WinJS.Navigation и вы можете создавать одностраничные приложения (single page apps), где все остальные страницы подгружаются в DOM одной основной страницы, или использовать привычную модель навигации и осуществлять переходы между страницами.&nbsp;<br /><br />AngularJS имеет возможности навигации между представлениями в рамках одностраничного приложения, которые очень похожи на&nbsp;<a href="https://msdn.microsoft.com/ru-ru/library/windows/apps/hh452768.aspx">концепцию навигации в WinJS</a>. Функции работы с навигацией доступны в виде отдельного модуля на сайте AngularJS. Популярной альтернативой модуль&nbsp;<a href="https://github.com/angular-ui/ui-router">UI Router</a>&nbsp;(мы уже установили из NuGet).<br /><br />Начав использовать AngularJS вы можете выбирать какими механизмами (WinJS или AngularJS) вы будете пользоваться в своем проекте. Единственное что надо помнить &ndash; это то, что у тебе телефона есть аппаратная кнопка Back, про которую AngularJS ничего не знает, и чтобы она работала, мы используем гибридный вариант навигации AngularJS+WinJS.</div>
</div>
</li>
</ul>
<p><br /><span>5. Запускаем приложение. Приложение должно запуститься и загрузить представление.&nbsp;</span><br /><br /><img src="https://habrastorage.org/files/06d/f52/3fe/06df523fe90b4a238a6b2309d0e4ec2b.PNG" alt="" /><br /><br /></p>
<h1>Заключение</h1>
<p><br /><span>Все больше технологий, которые мы привыкли видеть и использовать в веб, становятся доступны для мобильных платформ. И это просто замечательно.</span><br /><br /></p>
<h2>Библиотеки Angular для Windows Phone</h2>
<p><br /><a href="https://raw.githubusercontent.com/codemonkeychris/angular-winjs/master/js/angular-winjs.js">Библиотека Angular-WinJS</a><span>&nbsp;</span><br /><a href="https://github.com/MissUFO/AngularJs">Исправленный файл angular.js</a><br /><a href="https://github.com/olohmann/wp81-html-samples/tree/master/ng-todo">Пример кода: ToDoList для Windows Phone 8.1 на AngularJS</a><br /><br /></p>
<h2>Полезные ссылки</h2>
<p><br /><a href="https://docs.angularjs.org/api">Документация по AngularJS</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Первый митап для мобильных разработчиков в Microsoft</title>
      <link>https://docs.microsoft.com/archive/blogs/apps/33</link>
      <pubDate>Thu, 02 Oct 2014 08:45:46 GMT</pubDate>
      <dc:creator><![CDATA[Татьяна Сметанина]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/apps/2014/10/02/33/</guid>
      <description><![CDATA[Все чаще разработчики жалуются на отсутствие доступных мероприятий по их направлению, где они могли...]]></description>
      <content:encoded><![CDATA[<p><img src="https://habrastorage.org/files/ec7/d70/85c/ec7d7085c1924edc88b38eaae7c21de2.png" alt="" /><br /><br /><span>Все чаще разработчики жалуются на отсутствие доступных мероприятий по их направлению, где они могли бы общаться с такими же профессионалами как они сами, делиться идеями, опытом в области мобильной разработки и узнавать о технологиях из первых рук.&nbsp;</span><br /><br /><span>Мы решили возродить традицию встреч сообщества разработчиков, но немного изменили формат. Теперь это будут митапы с короткими докладами, временем на общение между собой и дискуссии.&nbsp;</span><br /><a name="habracut"></a><br /><span>Итак, первый митап для мобильных разработчиков пройдет&nbsp;</span><strong>16 октября 2014</strong><span>&nbsp;в офисе Microsoft.&nbsp;</span><br /><span>Встреча начнется в&nbsp;</span><strong>18:30</strong><span>, что позволит посетить мероприятие даже тем желающим, которые работают по стандартному офисному расписанию. На мероприятии каждый получит возможность пообщаться не только с нами, но и познакомиться с другими участниками.&nbsp;</span><br /><br /><span>Первый митап будет посвящен нашим последним анонсам&nbsp;</span><a href="https://habrahabr.ru/company/microsoft/blog/238763/">Windows 10</a><span>&nbsp;и&nbsp;</span><a href="https://www.xbox.com/ru-ru/xbox-one/meet-xbox-one">XBox One</a><span>&nbsp;и будет по-настоящему праздничным. Мы планируем проводить митапы с регулярностью&nbsp;</span><strong>раз в месяц</strong><span>, обещаем готовить вам различные сюрпризы, приглашать интересных экспертов в том числе из числа участников митапа.&nbsp;</span><br /><br /><span>Следить за расписанием и ближайшими встречами можно по ссылке:</span><a href="https://www.meetup.com/Microsoft-Mobile-Dev-Meetup">www.meetup.com/Microsoft-Mobile-Dev-Meetup</a><br /><br /></p>
<h4>Информация о первом митапе</h4>
<p><br /><span>Дата: 16 октября, четверг</span><br /><span>Время: 18:30 &ndash; 21.00&nbsp;</span><br /><span>Место: Москва, ул. Крылатская, д. 17, к.1, офис Microsoft</span><br /><br /></p>
<h4>Расписание</h4>
<p><br /><span>18.30 &mdash; 19.00 &ndash; Кофе-брейк, знакомство участников&nbsp;</span><br /><span>19.00 &mdash; 19.30 &ndash;&nbsp;</span><strong>Открытый показ Windows 10</strong><span>&nbsp;(Михаил Черномордиков aka&nbsp;</span><a class="user_link" href="https://habrahabr.ru/users/mixen/">mixen</a><span>)&nbsp;</span><br /><span>19.30 &mdash; 20.00 &ndash; Обсуждение, ответы на вопросы&nbsp;</span><br /><span>20.00 &mdash; 20.30 &ndash;&nbsp;</span><strong>Открытый показ Xbox One</strong><span>&nbsp;(Андрей Ивашенцев aka&nbsp;</span><a class="user_link" href="https://habrahabr.ru/users/inc/">Inc</a><span>)&nbsp;</span><br /><span>20.30 &mdash; 21.00 &ndash; Обсуждение, ответы на вопросы&nbsp;</span><br /><span>21.00 &mdash; 21.30 &ndash; Завершение мероприятия, трансфер</span><br /><br /></p>
<h4>Регистрация</h4>
<p><br /><span>Наши митапы&nbsp;</span><strong>открыты и доступны для всех</strong><span>&nbsp;желающих. Но, для того, чтобы правильно рассчитать количество мест, еды с делать митап более комфортным для вас, мы просим, по-возможности, оставлять заявки на регистрацию.&nbsp;</span><br /><br /><span>Регистрация на первый митап доступна&nbsp;</span><a href="https://www.meetup.com/Microsoft-Mobile-Dev-Meetup/events/210693902/">по ссылке</a><span>.</span><br /><br /><span>Подробную информацию о каждом из следуюших митапов мы будем публиковать по мере ее поступления на&nbsp;</span><a href="https://www.meetup.com/Microsoft-Mobile-Dev-Meetup">meetup.com</a><span>.</span><br /><br /></p>
<h4>Нам важно ваше мнение</h4>
<p><br /><span>Если вы хотите услышать или обсудить какую-то конкретную тему, увидеть какого-то конкретного эксперта или выступить самому &mdash; пишите об этом в комментариях.</span><br /><br /><span>Ждем вас в гости!</span><br /><br /></p>
<h4>Полезные ссылки</h4>
<p><br /><a href="https://www.meetup.com/Microsoft-Mobile-Dev-Meetup">Microsoft Mobile Dev Meetup</a><br /><a href="https://www.facebook.com/groups/universal.apps/">Сообщество разработчиков Phone и Windows приложений на Facebook</a><br /><a href="https://www.microsoftvirtualacademy.com/">Бесплатные онлайн-курсы по технологиям на MVA</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Windows 10 Technical Preview доступна для скачивания</title>
      <link>https://docs.microsoft.com/archive/blogs/apps/windows-10-technical-preview</link>
      <pubDate>Wed, 01 Oct 2014 14:53:28 GMT</pubDate>
      <dc:creator><![CDATA[Татьяна Сметанина]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/apps/2014/10/01/windows-10-technical-preview/</guid>
      <description><![CDATA[Вчера Microsoft&nbsp;представила Windows 10&nbsp;и сегодня, любой из вас может скачать и установить...]]></description>
      <content:encoded><![CDATA[<p><img src="https://habrastorage.org/files/540/a72/6ff/540a726ff1aa48b8959a1c4a2c4f72fb.png" alt="" /><br /><br /><span>Вчера Microsoft&nbsp;</span><a href="https://habrahabr.ru/company/microsoft/blog/238763">представила Windows 10</a><span>&nbsp;и сегодня, любой из вас может скачать и установить на своем компьютере или виртуальной машине&nbsp;</span><strong>предварительную версию</strong><span>&nbsp;этой операционной системы.</span><br /><a name="habracut"></a></p>
<h4>Где взять и как установить предварительную версию?</h4>
<p><br /><span>1. Зарегистрируйтесь в программе&nbsp;</span><a href="https://insider.windows.com/">Windows Insider</a><span>.&nbsp;</span><br /><br /><span>2. Ознакомьтесь с&nbsp;</span><a href="https://windows.microsoft.com/ru-ru/windows/preview-faq#faq=tab0">требованиями к системе</a><span>.</span><br /><br /><span>3. Скачайте один из подходящих вам дистрибутивов (в формате ISO):</span></p>
<ul>
<li><strong>Язык&nbsp;</strong>|&nbsp;<strong>Ссылка</strong>&nbsp;|&nbsp;<strong>SHA-1</strong></li>
<li>English 64-bit (x64)&nbsp;<a href="https://go.microsoft.com/fwlink/?LinkId=510225">Download (4.10 GB)</a>EB75A3D3C0F621F175B75DC65DB036D0E00EAC43</li>
<li>English 32-bit (x86)&nbsp;<a href="https://go.microsoft.com/fwlink/?LinkId=510226">Download (3.16 GB)</a>73AC23AD89489855F33CA224F196327740057E2E</li>
<li>English (United Kingdom) 64-bit (x64)&nbsp;<a href="https://go.microsoft.com/fwlink/?LinkId=510227">Download (4.08 GB)</a>17C6CD7224D13DB61B93A4A9D38202E3A0019378</li>
<li>English (United Kingdom) 32-bit (x86)&nbsp;<a href="https://go.microsoft.com/fwlink/?LinkId=510228">Download (3.17 GB)</a>BFF496678A09255738BFBFA14903295D55478C33</li>
</ul>
<p><br /><span>Ключ продукта:&nbsp;</span><strong>NKJFK-GPHP7-G8C3J-P6JXR-HQRJR</strong><br /><span>Страница загрузки дистрибутивов:&nbsp;</span><a href="https://windows.microsoft.com/ru-ru/windows/preview-download">windows.microsoft.com/ru-ru/windows/preview-download</a><br /><br /><span>4. Скопируйте дистрибутив на USB носитель или DVD.</span><br /><br /><span>5. Запустите&nbsp;</span><strong>setup.exe</strong><span>&nbsp;и начните установку. Перед экспериментами, не забывайте делать</span><a href="https://windows.microsoft.com/ru-ru/windows-8/create-usb-recovery-drive">резервные копии</a><span>.</span><br /><br /></p>
<h4>Программа Windows Insider</h4>
<p><br /><span>Наши коллеги в группе разработки ОС много думали и наконец придумали эту программу.</span><br /><br /><span>Зарегистрировавшись в программе&nbsp;</span><a href="https://insider.windows.com/">Windows Insider</a><span>, вы будете получать новейшие сборки и одними из первых узнавать о новых возможностях и продуктах.&nbsp;</span><br /><br /><span>Присоединившись к программе, вы будете иметь возможность принимать активное участие в развитии операционной системы &mdash; давать обратную связь по продукту, его возможностям и отправлять нам свои пожелания и замечания. Нет никакой гарантии, что всё что вы увидите или не увидите в предварительной версии будет частью финального релиза или наоборот не будет реализовано. Но своими отзывами, вы сможете воздействовать на этот процесс и поможете сделать Windows 10 еще лучше, полезнее и удобнее для вас.&nbsp;</span><br /><br /><span>В дистрибутив ОС встроено приложение&nbsp;</span><a href="https://windows.microsoft.com/ru-ru/windows/preview-how-to?ocid=tp_site_howtopage&amp;#how-to=tab5">Windows Feedback</a><span>, с помощью которого вы сможете делиться с нами отзывами о предварительной версии.</span><br /><br /><img src="https://habrastorage.org/getpro/habr/post_images/3f0/2e1/299/3f02e1299217cb1cc3e7b085bf633c91.png" alt="image" /><br /><br /><span>Для участников программы доступен&nbsp;</span><a href="https://answers.microsoft.com/en-us/windows/forum/windowstp">форум</a><span>, в котором вы можете задавать вопросы, получать ответы от специалистов со всего мира и искать необходимую информацию. Уже сейчас на форуме размещено более 1000 тем.</span><br /><br /><img src="https://habrastorage.org/files/81b/af5/92f/81baf592ff35459b8ce610866157652a.PNG" alt="" /><br /><br /></p>
<h4>Полезные ссылки</h4>
<p><br /><a href="https://habrahabr.ru/company/microsoft/blog/238763/#first_unread">Microsoft представила Windows 10</a><br /><a href="https://preview.windows.com/">Официальная страница Windows 10</a><br /><a href="https://blogs.windows.com/bloggingwindows/2014/09/30/announcing-windows-10/">Блог про Windows 10</a><br /><a href="https://blogs.windows.com/buildingapps/2014/09/30/universal-windows-apps-get-better-with-windows-10/">Блог про разработку приложений для Windows 10</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft представила Windows 10</title>
      <link>https://docs.microsoft.com/archive/blogs/apps/microsoft-windows-10</link>
      <pubDate>Wed, 01 Oct 2014 14:52:23 GMT</pubDate>
      <dc:creator><![CDATA[Татьяна Сметанина]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/apps/2014/10/01/microsoft-windows-10/</guid>
      <description><![CDATA[Несколько часов назад Microsoft представила новую операционную систему Windows, которая придет на...]]></description>
      <content:encoded><![CDATA[<p><img src="https://habrastorage.org/files/c79/d37/d1f/c79d37d1f9534d9fb47c65e9458d20a0.png" alt="" /><br /><br /><span>Несколько часов назад Microsoft представила новую операционную систему Windows, которая придет на смену Windows 8.1. Операционная система получила название Windows 10.&nbsp;</span><br /><a name="habracut"></a><br /><span>Новая OC позиционируется как одна, общая операционная система для огромного спектра различных устройств.</span><br /><br /></p>
<h4>Единая Windows для всех устройств</h4>
<p><br /><span>Windows 10 будет устанавливаться на более широкий спектр устройств по сравнению с предыдущими версиями OC. В число этих устройств входят не только персональные компьютеры, ноутбуки, планшеты, но и смартфоны, телевизоры, различные платы и промышленные устройства, используемые для сценариев Internet of Things.</span><br /><br /><span>Новая OC также будет являться&nbsp;</span><strong>единой платформой для разработки</strong><span>&nbsp;приложений и</span><strong>единым каналом доставки</strong><span>&nbsp;приложений через&nbsp;</span><a href="https://windows.microsoft.com/ru-ru/windows-8/apps#Cat=t0">Магазин</a><span>.</span><br /><br /></p>
<h4>Улучшенный интерфейс пользователя</h4>
<p><br /><span>Интерфейс операционной системы, с одной стороны, остался привычным, с другой стороны, приобрел несколько новых полезных возможностей.</span><br /><br /><strong>Меню &laquo;Пуск&raquo;</strong><br /><br /><span>Открывается по нажатию на логотип в левом нижнем углу рабочего стола. В левом столбце меню содержатся ярлыки к последним запущенным приложениям, в правом &mdash; плитки</span><a href="https://dev.windows.com/ru-ru/develop/Building-universal-Windows-apps">универсальных приложений</a><span>. В меню также находятся кнопки управления питанием и обновленная функция поиска, для поиска не только в локальной системе, но и в интернете.</span><br /><br /><img src="https://habrastorage.org/files/2dd/265/7cf/2dd2657cf1e146dc8a3405bb85c67b47.png" alt="" /><br /><br /><strong>Универсальные окна приложений</strong><br /><br /><span>Теперь и классические приложения для рабочего стола и новые&nbsp;</span><a href="https://dev.windows.com/ru-ru/develop/Building-universal-Windows-apps">универсальные приложения</a><span>запускаются в собственном окне на рабочем столе.</span><br /><br /><img src="https://habrastorage.org/files/18d/e8a/5f3/18de8a5f323641e9b492b975507f2f5d.png" alt="" /><br /><br /><strong>Улучшенная функция Snap</strong><br /><br /><span>Работать в нескольких приложениях сразу стало проще и удобнее. Теперь функция Snap позволяет открыть до 4 приложений на экране одновременно, а Windows подсказывает, какие еще приложения запущены и как их можно разместить. Windows 10 поможет эффективнее использовать незанятое пространство экрана для других приложений.</span><br /><br /><img src="https://habrastorage.org/files/940/604/5fc/9406045fcb614226b711ce8c28c6da6e.png" alt="" /><br /><br /><strong>Множество рабочих столов</strong><br /><br /><span>Пользователь может создавать несколько рабочих столов и размещать на них окна приложений. Можно вывести все созданные столы на экран и переключаться между ними.&nbsp;</span><br /><br /><img src="https://habrastorage.org/files/a51/4ce/5f0/a514ce5f04f04cff8561e1b201f310dc.jpg" alt="" /><br /><br /><strong>Многозадачность</strong><br /><br /><span>На панели задач появилась новая кнопка Task View. При нажатии на нее, на экране появляются в уменьшенном виде окна всех запущенных приложений.&nbsp;</span><br /><br /></p>
<h4>Особое внимание к корпоративным пользователям и данным</h4>
<p><br /><span>При создании Windows 10 особое внимание было уделено корпоративным пользователям.&nbsp;</span><br /><span>Новая ОС будет совместима со всеми традиционными системами управления, которые используют организации.&nbsp;</span><br /><br /><span>Операционная система содержит новые возможности по разделению рабочих и персональных данных на устройствах всех типов, что позволит воплотить концепцию BYOD в организациях.&nbsp;</span><br /><br /></p>
<h4>Попробуйте новую Windows</h4>
<p><br /><span>1 октября на&nbsp;</span><a href="https://preview.windows.com/">официальной странице Windows 10</a><span>&nbsp;появится возможность скачать&nbsp;</span><strong>Windows 10 Technical Preview</strong><span>.&nbsp;</span><br /><span>Не упустите возможность посмотреть на новую OC своими глазами и попробовать своими руками.</span><br /><span>Информация о дате релиза операционной системы и условиях обновления до Windows 10 будет объявлена позже.</span><br /><br /><strong>UPD:</strong><span>&nbsp;Предварительная версия Windows 10 уже&nbsp;</span><a href="https://habrahabr.ru/company/microsoft/blog/238885/">доступна для скачивания</a><span>.</span><br /><br /></p>
<h4>Полезные ссылки</h4>
<p><br /><a href="https://www.microsoft.com/ru-ru/news/2014/09/unveil-windows-10.aspx">Официальный пресс-релиз на русском языке</a><br /><a href="https://preview.windows.com/">Официальная страница Windows 10</a><br /><a href="https://blogs.windows.com/bloggingwindows/2014/09/30/announcing-windows-10/">Блог про Windows 10</a><br /><a href="https://blogs.windows.com/buildingapps/2014/09/30/universal-windows-apps-get-better-with-windows-10/">Блог про разработку приложений для Windows 10</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Новый сервис от Fortumo.com для операторского биллинга покупок в Windows Phone и Windows приложениях</title>
      <link>https://docs.microsoft.com/archive/blogs/apps/fortumo-com</link>
      <pubDate>Mon, 22 Sep 2014 05:38:00 GMT</pubDate>
      <dc:creator><![CDATA[Татьяна Сметанина]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/apps/2014/09/22/fortumo-com/</guid>
      <description><![CDATA[Хорошая новость для Windows Phone и Windows разработчиков!Компания&nbsp;Fortumo, известная многим...]]></description>
      <content:encoded><![CDATA[<p><img src="https://habrastorage.org/files/3e7/209/336/3e720933617940cb8ee9f04196fe5709.PNG" alt="" /><br /><br /><span>Хорошая новость для Windows Phone и Windows разработчиков!</span><br /><br /><span>Компания&nbsp;</span><a href="https://fortumo.com/">Fortumo</a><span>, известная многим Android разработчикам и осуществляющая</span><strong>операторский биллинг</strong><span>&nbsp;для мобильных приложений, открыла свой сервис теперь и&nbsp;</span><strong>для Windows Phone и Windows разработчиков в России</strong><span>.&nbsp;</span><br /><a name="habracut"></a><br /><span>Использование этого сервиса в своем приложении предоставит вашим пользователям возможность осуществлять покупки внутри приложения&nbsp;</span><strong>без использования банковской карты</strong><span>, прямо со счета мобильного оператора.</span><br /><br /><span>Для разработчика, это возможность завоевать дополнительную аудиторию людей, которые, по каким-либо причинам, не хотят использовать карты для мобильных платежей.</span><br /><br /><span>В связи с запуском своего сервиса,&nbsp;</span><a href="https://fortumo.com/">Fortumo</a><span>&nbsp;запустила и&nbsp;</span><a href="https://fortumo.com/wintegration">специальную акцию</a><span>, которая позволяет получить дополнительные&nbsp;</span><strong>$5,000</strong><span>&nbsp;на рекламу вашего приложения в сети</span><a href="https://adduplex.com/">AdDuplex</a><span>&nbsp;(если доход вашего приложения от $2,000 в месяц).&nbsp;</span><br /><br /></p>
<h4>Основные преимущества использования сервиса</h4>
<p>&nbsp;</p>
<ul>
<li>Биллинг мобильного оператора &mdash; не требует наличия кредитной карты или регистрации. Доступно для более чем 4 миллиардов пользователей по всему миру.</li>
<li>Самонастройка сервиса, активация в течение нескольких минут и простая интеграция.</li>
<li>Лучшее покрытие. С Fortumo вы можете принимать платежи от пользователь без кредитных карт на 6 континентах из 7 (пока без Антарктиды).</li>
<li>Без платы за подключение, без абонентской платы, без минимального оборота. Простое разделение дохода с каждой транзакции. Сервис получает свою комиссию только если вы получаете доход!</li>
</ul>
<p>&nbsp;</p>
<h4>Как начать использовать разработчику</h4>
<p><br /><span>1.&nbsp;</span><a href="https://smsfortumo.ru/register?m=1">Зарегистрироваться на сайте Fortumo.com</a><br /><span>2. Заполнить профиль и указать данные банковского счета для вывода средств.</span><br /><span>3. Настроить мобильные платежи:</span></p>
<ul>
<li><a href="https://developers.fortumo.com/in-app-purchasing-on-windows-intro/">Покупки внутри приложений (in-app purchase)</a>.</li>
<li><a href="https://developers.fortumo.com/mobile-payments-for-web-apps/">Кроссплатформенные мобильные платежи</a>.&nbsp;<br /><img src="https://habrastorage.org/files/1ed/348/d62/1ed348d62a5342ccb8963a177dbef2f2.PNG" alt="" /></li>
<li><a href="https://developers.fortumo.com/mobile-payments-api/">Продвинутые API для реализации сложных сценариев приема платежей</a>.</li>
</ul>
<p><br /><span>2. Ждать осуществления пользователем покупок. Если всё проходит нормально, Fortumo завершает транзакцию и сообщает разработчику об успешной оплате. В конце месяца, заработанные деньги будут переведены на указанный счет разработчику.</span><br /><br /></p>
<h4>Как выглядит сервис для пользователя</h4>
<p><br /><span>1. Пользователь делает покупку. После подтверждения платежа деньги будут сняты со счета телефона.</span><br /><br /><img src="https://habrastorage.org/files/c63/94f/860/c6394f860385465f890cfbe90cf980ea.PNG" alt="" /><br /><br /><span>2. Fortumo обрабатывает платеж. Транзакция проверяется на фрод и перенаправляется соответствующему мобильному оператору.</span><br /><span>3. Если оплата завершена успешно, пользователь получает оплаченный товар. Оператор проверяет баланс абонента и сообщает&nbsp;</span><a href="https://fortumo.com/">Fortumo</a><span>&nbsp;об успешной оплате.</span><br /><br /><img src="https://habrastorage.org/files/865/6e4/205/8656e4205fec424e957d8bfba0c58ad4.PNG" alt="" /><br /><br /></p>
<h4>Заключение</h4>
<p><br /><span>Операторский биллинг &ndash; популярный способ осуществления покупок на мобильных устройствах во всем мире и теперь для Windows Phone и Windows приложений есть простое средство его реализовать и использовать.</span><br /><br /><span>Ведущие производители игровой индустрии, такие как&nbsp;</span><a href="https://www.windowsphone.com/en-us/store/app/cloud-raiders/c3f87aa8-da07-45d2-a5bc-e2f5a0557015">Game Insight</a><span>,&nbsp;</span><a href="https://www.windowsphone.com/en-us/store/app/drag-racing/5d1ce78d-7d18-4b52-aa7e-7b6c6cf4603f">Creative Mobile</a><span>,&nbsp;</span><a href="https://www.windowsphone.com/en-us/store/app/boyaa-texas-poker/3057c143-dba9-4b1e-87fe-17c1c22c47af">Boyaa</a><span>,</span><a href="https://www.windowsphone.com/en-us/store/app/zombie-derby/b37542bc-9881-4dd2-903b-a356fd0d090b">Herocraft</a><span>&nbsp;и&nbsp;</span><a href="https://www.windowsphone.com/en-us/store/app/survival-run-with-bear-grylls/bb6871b5-7d27-40ea-97dd-4913b82566a3">Floor84 Studios</a><span>&nbsp;уже используют Fortumo для биллинга покупок внутри приложения!</span><br /><br /></p>
<h4>Полезные ссылки</h4>
<p><br /><a href="https://fortumo.com/">Сайт Fortumo.com</a><br /><a href="https://fortumo.com/wintegration">Специальная акция $5 000 на рекламу в AdDuplex</a><br /><a href="https://fortumo.com/windows">Fortumo SDK для Windows Phone и Windows</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Новый онлайн курс "Мобильная разработка для веб-разработчиков"</title>
      <link>https://docs.microsoft.com/archive/blogs/apps/73</link>
      <pubDate>Mon, 18 Aug 2014 13:22:09 GMT</pubDate>
      <dc:creator><![CDATA[Татьяна Сметанина]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/apps/2014/08/18/73/</guid>
      <description><![CDATA[Новый курс виртуальной академии Microsoft по мобильной разработке на html5 и javascript поможет...]]></description>
      <content:encoded><![CDATA[<p><span>Новый курс виртуальной академии Microsoft по мобильной разработке на html5 и javascript поможет любому веб-разработчику получить компетенцию мобильного разработчика и начать разрабатывать приложения для Windows Phone 8.1 и Windows 8.1.</span></p>
<p><span><a href="https://www.microsoftvirtualacademy.com/training-courses/mobile-development-for-web-developers-rus" rel="nofollow nofollow" target="_blank">https://www.microsoftvirtualacademy.com/training-courses/mobile-development-for-web-developers-rus</a><br /></span></p>]]></content:encoded>
    </item>
    <item>
      <title>Семинар и мини-хакатон по обновлению приложений до Windows Phone 8.1 в офисе Microsoft</title>
      <link>https://docs.microsoft.com/archive/blogs/apps/1077</link>
      <pubDate>Fri, 15 Aug 2014 09:22:00 GMT</pubDate>
      <dc:creator><![CDATA[Татьяна Сметанина]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/apps/2014/08/15/1077/</guid>
      <description><![CDATA[Команда Microsoft рада пригласить вас на уникальный семинар и мини-хакатон, посвященный обновлению...]]></description>
      <content:encoded><![CDATA[<p><img src="https://alpha.hstor.org/getpro/habr/post_images/958/19f/864/95819f86449af9c104781c09a2ba522f.jpg" alt="image" /><br /><br /><span>Команда Microsoft рада пригласить вас на уникальный семинар и мини-хакатон, посвященный обновлению ваших приложений до Windows Phone 8.1 и созданию универсальных приложений!</span><br /><br /><span>На семинаре вы сможете познакомиться с новой Windows Phone 8.1, узнать, что такое универсальные приложения, какие сценарии существуют для обновления приложений, а также начать обновлять имеющиеся у вас приложения до версии 8.1 под руководством наших экспертов.&nbsp;</span><br /><br /><span>Семинар состоится&nbsp;</span><strong>29 августа с 16:00 до 21:00</strong><span>&nbsp;в офисе Microsoft, по адресу г. Москва, ул. Крылатская, д.17, к.1.</span><br /><a name="habracut"></a><br /><span>Участие по предварительной регистрации абсолютно бесплатно!</span><br /><br /><span>В программе:</span><br /><br /><span>16.00 &mdash; 16.30 &ndash; Современная платформа Windows 8.1 и универсальные приложения, Дима Сошников</span><br /><span>16.45 &mdash; 17.15 &ndash; Портирование приложений с Windows 8 на Windows Phone 8.1, Сергей Пугачев</span><br /><span>17.30 &mdash; 18.00 &ndash; Обновление с Windows Phone 8.0 (Silverlight ) до Windows Phone 8.1 (Silverlight), Маша Горелкина</span><br /><span>18.15 &mdash; 18.45 &ndash; Обновление с Windows Phone 8.0 (Silverlight ) до Windows Phone 8.1 (XAML), Таня Сметанина</span><br /><span>19.00 &mdash; 21.00 &ndash; Мини-хакатон. Обновление приложений, помощь экспертов, пицца</span><br /><span>21.00 &mdash; 22.00 &ndash; Завершение мероприятия. Трансфер до метро.</span><br /><br /><span>Для регистрации на семинар, необходимо написать на&nbsp;</span><a href="mailto: ru-events@microsoft.com">этот адрес</a><span>&nbsp;или в&nbsp;</span><a href="https://www.facebook.com/events/312841695565038">событие на facebook</a><span>, указав:</span><br /><br /><span>&bull; ФИО *:</span><br /><span>&bull; E-mail *:</span><br /><span>&bull; Ссылка на приложение в Windows или Phone Store *:&nbsp;</span><br /><br /><span>Количество мест ограничено.&nbsp;</span><br /><br /><span>Наличие приложения является обязательным критерием участия. С собой обязательно берите ноутбук, хорошее настроение и членов своей команды ;)</span><br /><br /><span>Для тех, кто не cможет посетить семинар лично, чуть позже, мы планируем создать онлайн курс и разместить материалы в&nbsp;</span><a href="https://www.microsoftvirtualacademy.com/">виртуальной академии Microsoft</a><span>.</span><br /><br /><span>С наилучшими пожеланиями,</span><br /><span>Команда Microsoft.</span><br /><br /></p>
<h4>Дополнительные ссылки</h4>
<p><br /><a href="https://www.facebook.com/events/312841695565038">Событие на facebook</a><br /><a href="https://aka.ms/gomvarus">Бесплатные курсы виртуальной академии Microsoft</a><br /><a href="https://aka.ms/azure_trial_free_rus">Azure бесплатно на 30 дней!</a><br /><a href="https://aka.ms/getvsrus">Бесплатная или пробная Visual Studio 2013</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Обновляем приложение с Windows Phone 8.0 до 8.1 и универсального</title>
      <link>https://docs.microsoft.com/archive/blogs/apps/windows-phone-8-0-8-1-108</link>
      <pubDate>Tue, 22 Jul 2014 04:24:00 GMT</pubDate>
      <dc:creator><![CDATA[Татьяна Сметанина]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/apps/2014/07/22/windows-phone-8-0-8-1-108/</guid>
      <description><![CDATA[Если у вас уже есть приложения под Windows Phone 8 или более ранние версии OS, возможно, вы уже...]]></description>
      <content:encoded><![CDATA[<p>Если у вас уже есть приложения под Windows Phone 8 или более ранние версии OS, возможно, вы уже начинаете задумываться, стоит ли вам обновлять свои приложения до новой версии, каким образом это проще всего сделать и сколько это может занять времени.</p>
<p>Это простые вопросы, для ответа на которые мы опубликовали серию статей, описывающих основные сценарии обновления в пошаговом режиме.</p>
<p><a href="https://habrahabr.ru/company/microsoft/blog/229727/">Новая Windows Phone 8.1. Что делать разработчику приложений?</a></p>
<p><a href="https://habrahabr.ru/company/microsoft/blog/230015/">Обновляем Windows Phone Silverlight 8.0 приложение до Windows Phone Silverlight 8.1</a></p>
<p><a href="https://habrahabr.ru/company/microsoft/blog/229931/">Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML)</a></p>
<p><a href="https://habrahabr.ru/company/microsoft/blog/230303/">Превращаем Windows Store приложение в универсальное</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Превращаем Windows Store приложение в универсальное</title>
      <link>https://docs.microsoft.com/archive/blogs/apps/windows-store</link>
      <pubDate>Fri, 18 Jul 2014 13:01:35 GMT</pubDate>
      <dc:creator><![CDATA[Татьяна Сметанина]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/apps/2014/07/18/windows-store/</guid>
      <description><![CDATA[Сегодня мы поговорим о возможности расширения Windows Store приложения до универсального. В...]]></description>
      <content:encoded><![CDATA[<p><img src="https://habrastorage.org/getpro/habr/post_images/772/3f3/5fc/7723f35fc60939b8763679a97ca6b29c.png" alt="" /> Сегодня мы поговорим о возможности расширения Windows Store приложения до универсального. В результате работы вы получите не только Windows Store приложение, но и Windows Phone 8.1 приложение, а вместе с этим, <strong>новую аудиторию пользователей</strong>, которые смогут использовать ваше приложение <strong>с различных устройств, заплатив за него один раз</strong> и сохраняя данные и <strong>состояние между устройствами</strong>. В этой статье описывается процесс расширения Windows Store приложения до Windows Phone, типовые проблемы и их решения.</p>
<h5>Введение</h5>
<p>Универсальное приложение от Microsoft - это технология разработки приложений, работающих на Windows 8.1 <strong>не зависимо от форм фактора устройства</strong>: телефон, планшет или ПК. Чтобы создавать универсальные приложения для Windows 8.1 и Windows Phone 8.1, необходима операционная система <a href="https://windows.microsoft.com/ru-ru/windows/home">Windows 8.1</a> и <a href="https://www.visualstudio.com/ru-ru/downloads/download-visual-studio-vs">Visual Studio 2013</a>Update 2. Начиная разработку проекта нового типа &laquo;Universal apps&raquo;, обратим внимание на шаблоны с макетами интерфейса, при выборе которых получаем автоматически сгенерированное решение из следующих проектов:</p>
<ul>
<li>Проект Windows 8.1;</li>
<li>Проект Windows Phone 8.1;</li>
<li>Проект, содержащее общий код (Shared).</li>
</ul>
<p>Общий исходный код <strong>включает элементы интерфейса и вызовы API</strong>, что значительно сокращает объем исходного кода для каждого из приложений. Отметим, что внешний вид приложения для каждой из платформ будет отличаться, благодаря особенностям поведения некоторых элементов интерфейса на разных устройствах. Универсальные приложения поддерживаютcя для С++, С# и JavaScript. Подробнее о новых возможностях универсальных приложений ранее писали в этой <a href="https://habrahabr.ru/company/microsoft/blog/218441/">статье</a>.</p>
<h5>Пример перехода от Windows Store приложения до универсального</h5>
<p>Осуществим переход от Windows 8.1 приложения до универсального, путем добавления Windows Phone 8.1 проекта в решение:</p>
<ol><ol>
<li>Под Windows Phone 8.1 приложением явно имеем ввиду только WinRT XAML приложения, исключая Silverlight 8.1. Приложения на Silverlight не имеют возможности расширения до универсальных.</li>
<li>Открываем проект приложения для Windows 8.1: <img src="https://habrastorage.org/getpro/habr/post_images/4fb/414/43c/4fb41443c0fe7af06850fa0765098db4.png" alt="" /> Главная задача демонстрационного приложения - отображение картинок из заданной директории на устройстве: <img src="https://habrastorage.org/getpro/habr/post_images/7a2/286/e2e/7a2286e2ee88e87bd72cc028a7506a5c.png" alt="" /></li>
<li>Добавляем в приложение Windows 8.1 приложение Windows Phone 8.1: <img src="https://habrastorage.org/getpro/habr/post_images/80a/f85/51e/80af8551e80a10a7587a0cf468a05966.png" alt="" /></li>
Нажимаем OK:</ol></ol>
<p><img src="https://habrastorage.org/getpro/habr/post_images/928/eb1/ebd/928eb1ebd0fc7462892cec50b2376825.png" alt="" /></p>
<ol>
<li>Получаем в обозревателе решений дополнительно проект для Windows Phone 8.1 и проект с общим кодом: <img src="https://habrastorage.org/getpro/habr/post_images/62d/7ad/055/62d7ad055de77ee1d8449e1d23bd8b3b.png" alt="" /></li>
<li>Изначально проект с общим кодом пустой, поэтому из приложения для Windows 8.1 скопируем следующие элементы:
<ul>
<li>Каталоги: Сommon, Models, ViewModel <img src="https://habrastorage.org/getpro/habr/post_images/e07/ea1/cd6/e07ea1cd657c3ff8a00489607925b375.png" alt="" /></li>
<li>И файлы: ImageViewPage.xaml, MainPage.xaml <img src="https://habrastorage.org/getpro/habr/post_images/ba2/9f5/ded/ba29f5dede9fdb275b5a0c2d41a6945e.png" alt="" /></li>
</ul>
</li>
<li>Проверим что все элементы корректно скопировались: <img src="https://habrastorage.org/getpro/habr/post_images/a7c/7ea/b18/a7c7eab187e11ce783faad5a3d8d170f.png" alt="" /></li>
<li>Удалим из проекта Windows 8.1, элементы которые дублируются в общем проекте: <img src="https://habrastorage.org/getpro/habr/post_images/48b/725/8d6/48b7258d63414f1a4d692c961decccc0.png" alt="" /> Каталоги и файлы: <img src="https://habrastorage.org/getpro/habr/post_images/359/f66/c27/359f66c27ebb17f726bc9cf948bcf8de.png" alt="" /></li>
<li>Из проекта Windows Phone 8.1 так же удалим дублирующие элементы: <img src="https://habrastorage.org/getpro/habr/post_images/785/41f/968/78541f968f4a3ed3ab9f0645e580b68d.png" alt="" /> Это необходимо сделать, потому что основная функция проекта с общим кодом заключается в том, чтобы распределять находящийся в нем код на оба проекта Windows 8.1 и Windows Phone 8.1. Поэтому дублирующие файлы просто не нужны в обоих проектах.</li>
</ol>
<h5>Протестируем как приложение работает под Windows Phone 8.1</h5>
<p>Установим в качестве запускаемого проекта Windows Phone 8.1: <img src="https://habrastorage.org/getpro/habr/post_images/d96/fb6/d90/d96fb6d901a9948c05cc8a318d09d21b.png" alt="" /> Запустим в эмуляторе: <img src="https://habrastorage.org/getpro/habr/post_images/c55/6b8/744/c556b874473173c07b53ff0c9e680d6a.png" alt="" /> Приложение запустилось не корректно и мы получили следующие ошибки: <img src="https://habrastorage.org/getpro/habr/post_images/13b/675/e33/13b675e33ddafb23f9d7ef56ea2cb1b3.png" alt="" /> Нажимаем &laquo;Break&raquo; и пробуем избавиться от проблемы. Откроем файл MainPage.xaml из общего проекта Shared: <img src="https://habrastorage.org/getpro/habr/post_images/160/0e7/737/1600e7737cdef78638d8ea18a85b24bd.png" alt="" /> Обратим внимание, что для любого XAML файла из общего проекта можно выбрать режим редактирования, где будет отдельно подсвечиваться активный код для Windows 8.1 или Windows Phone 8.1: <img src="https://habrastorage.org/getpro/habr/post_images/471/6ef/058/4716ef0585fcfbbd03b612e2e3939bdc.png" alt="" /> Сравним два режима редактирования: <strong>Windows 8.1</strong> <img src="https://habrastorage.org/getpro/habr/post_images/984/ce1/376/984ce1376756bc3e50b491709b46a48e.png" alt="" /> <strong>Windows Phone 8.1</strong> <img src="https://habrastorage.org/getpro/habr/post_images/41d/aa0/20d/41daa020d9b71e1f58223054a2ccf5ed.png" alt="" /> Наблюдаем не лопознанный компилятором элемент DataContext, который говорит нам о том, что мы забыли добавить в App.xaml проекта Windows Phone 8.1 те же подключения что и в App.xaml файле для Windows 8.1: Теперь приложение запустилось, но не отображает данные: <img src="https://habrastorage.org/getpro/habr/post_images/7b6/d7a/69c/7b6d7a69c5b905b24d0449e2271b945d.png" alt="" /> Причиной является то, что мы указали в качестве директории ресурсов библиотеку изображений, которая используется на ПК устройствах. Но для мобильных устройств хранилище ресурсов следует изменить на хранилище изображений в фотоальбоме устройства. Откроем файл LibraryLoaderViewModel.xaml: <img src="https://habrastorage.org/getpro/habr/post_images/b8c/390/f57/b8c390f57ab7466b7bb8e3b95cbb9f58.png" alt="" /> И поменяем функцию private async Task LoadImages() следующим образом образом: private async Task LoadImages() { #if WINDOWS_APP var folder = Windows.Storage.KnownFolders.PicturesLibrary; #elif WINDOWS_PHONE_APP var folder = Windows.Storage.KnownFolders.CameraRoll; #endif var imageFiles = await folder.GetFilesAsync(); foreach (var imageFile in imageFiles) { var image = new ImageItem(imageFile, ImageLocation.CameraRoll); _libraryImages.Add(image); } await Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt; { OnPropertyChanged("LibraryImages"); }); } Объясняем приложению к какому хранилищу изображений следует обращаться в зависимости от устройства. Для этого используем конструкцию #if. Тем самым разделяя действия, отличные для платформ Windows 8.1 и Windows Phone 8.1: Windows = WINDOWS_APP Windows Phone = WINDOWS_PHONE_APP Настроим доступ к хранилищу, используя свойство Capabilities в Package.appxmanifest для Windows Phone 8.1 проекта: <img src="https://habrastorage.org/getpro/habr/post_images/b78/2cb/212/b782cb212e6aabb94c969161856a6ee3.png" alt="" />Все работает замечательно. Результат можно проверить, подключив свое собственное устройство и запустить приложение с него.</p>
<ul>
<li>Обратим внимание, что дизайнер мобильного приложения не корректно показывает разметку: <img src="https://habrastorage.org/getpro/habr/post_images/7e7/9ce/8d2/7e79ce8d2a954132af6d4ee0e5165176.png" alt="" /> У нас есть возможность проверить как выглядит приложение на экранах различных размеров, используя панель инструментов Device: <img src="https://habrastorage.org/getpro/habr/post_images/d4f/ed4/e7d/d4fed4e7d64f2288c553b4e3308ed128.png" alt="" /> Здесь перебираем варианты размеров экрана: <img src="https://habrastorage.org/getpro/habr/post_images/d18/4b4/3ee/d184b43eea8c27405640a8b11fb38e6d.png" alt="" />Настраиваем корректное отображение для каждого, если это необходимо, например, в MainPage.xaml файле меняем указанное свойство Height = &ldquo;125&rdquo; на Auto в случае с размером 480х800:Теперь приложение готово к использованию на любых устройствах Windows 8.1 и Windows Phone 8.1.
<h5>Другие сценарии поддержки распределяемого кода</h5>
Существует несколько вариантов хранения и использования общего кода для кроссплатформенных приложений Windows 8.1 и Windows Phone 8.1:
<ul>
<li>Самый новый и простой способ &ndash; это <strong>проект с общим кодом Shared </strong>внутри решения Universal app. Данный подход является самым легким и поддерживает любой вид распределяемых данных: код, XAML файлы, изображения, XML/JSON, RESW. Здесь реализован уже знакомы нам инструмент Visual State Manager, который позволяет увидеть общий и различный код для платформ.</li>
<li><strong>Portable Class Library</strong> &ndash; это библиотеки и WinRT компоненты;</li>
<li>Одной из интересных особенностей Portable Class Library является возможность написать библиотеку на любом из языков, например, С++ или JavaScript, а использовать в любом приложении. Например, вы хотите создать повторно используемую библиотеку для разных приложений или в случае кроссплатформенной разработки для Windows, iOS и Android.</li>
<li><strong>Добавление ссылок на файлы</strong> с общим кодом в проект. Например, когда требуется сделать из Silverlight приложения Windows Store или Windows Phone 8.1 (XAML) приложение.</li>
</ul>
<h5>Заключение</h5>
Процесс расширения Windows Store приложения до универсального оказался прост, так как API для телефона и для ПК теперь <strong>совпадают на 90%</strong>. При разработке и портировании, следует обратить внимание на <strong>некоторые различия между платформами</strong>, как это было в случае с хранилищем изображений, и <strong>учесть различные форм факторы и разрешения экрана </strong>для различных устройств.
<h5>Полезные ссылки</h5>
<a href="https://habrahabr.ru/company/microsoft/blog/229727/">Новая Windows Phone 8.1. Что делать разработчику приложений?</a> <a href="https://habrahabr.ru/company/microsoft/blog/230015/">Обновляем Windows Phone Silverlight 8.0 приложение до Windows Phone Silverlight 8.1</a> <a href="https://habrahabr.ru/company/microsoft/blog/229931/">Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML)</a> <a href="https://www.microsoftvirtualacademy.com/">Обучающие курсы виртуальной академии Microsoft (MVA) </a> <a href="https://aka.ms/getvsrus">Загрузить бесплатную или пробную Visual Studio 2013 </a> <a href="https://aka.ms/wpstartrus">Стать разработчиком приложений Windows Phone </a> <a href="https://1drv.ms/1nc66em">Скачать пример приложения из этой статьи </a> <a href="https://code.msdn.microsoft.com/windowsapps/Universal-Windows-app-cb3248c3">Скачать примеры кода универсальных приложений (c#, c++, javascript)</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Обновляем Windows Phone 8.0 приложение до Windows Phone 8.1(XAML)</title>
      <link>https://docs.microsoft.com/archive/blogs/apps/windows-phone-8-0-windows-phone-8-1xaml</link>
      <pubDate>Fri, 18 Jul 2014 12:59:42 GMT</pubDate>
      <dc:creator><![CDATA[Татьяна Сметанина]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/apps/2014/07/18/windows-phone-8-0-windows-phone-8-1xaml/</guid>
      <description><![CDATA[Это третья статья из цикла, посвященного обновлению Windows Phone 8.0 приложений до версии 8.1. На...]]></description>
      <content:encoded><![CDATA[<p><a href="https://habrastorage.org/getpro/habr/post_images/179/990/d16/179990d16ee626c318c5ced2068de9d5.png"><img src="https://habrastorage.org/getpro/habr/post_images/179/990/d16/179990d16ee626c318c5ced2068de9d5.png" alt="" /></a> Это третья статья из цикла, посвященного обновлению Windows Phone 8.0 приложений до версии 8.1. На этот раз, мы поговорим про самый сложный сценарий &ndash; обновление приложения Windows Phone 8.0 (Silverlight) до Windows Phone 8.1 (XAML). Этот процесс не такой прозрачный и понятный как <a href="https://habrahabr.ru/company/microsoft/blog/230015/">в случае с Silverlight</a> или Windows Store, где есть специальные действия в Visual Studio (Reterget), чтобы поменять сборки и ссылки на них. В нашем случае, придется пересобрать приложение в ручную для новой версии. Этим мы и займемся. По результатам работы, мы <strong>не только обновим приложение до новой платформы 8.1</strong>, перейдем на использование <a href="https://msdn.microsoft.com/ru-ru/library/windows/apps/dn632424.aspx">WinRT</a> и <strong>сможем пользоваться её возможностями</strong>, но и получим проект <strong>универсального приложения</strong>для Phone и Windows с общим кодом. План работы такой:</p>
<ul>
<li>Создание нового проекта Windows Phone 8.1</li>
<li>Перенос кода</li>
<li>Перенос интерфейса</li>
<li>Создание проекта Windows Store</li>
</ul>
<p>У меня есть простое приложение, разработанное под Windows Phone 8.0, которое мы будем обновлять до Windows Phone 8.1. Приложение состоит из двух проектов: проект Windows Phone приложения и Portable Class Library со всякими нужными классами. Из сторонних библиотек это приложение использует только <a href="https://www.nuget.org/packages/MvvmLight/">MVVMLight</a>. <a href="https://habrastorage.org/getpro/habr/post_images/b54/5b6/caa/b545b6caa4a84ac687b15b13c1e8a190.png"><img src="https://habrastorage.org/getpro/habr/post_images/b54/5b6/caa/b545b6caa4a84ac687b15b13c1e8a190.png" alt="" /></a></p>
<h4>Создание нового проекта Windows Phone 8.1</h4>
<p>Чтобы приложение работало не только на Windows Phone 8.1, но и на предыдущих версиях Windows Phone, придется продолжить поддерживать проект Windows Phone 8.0 на ряду с новым проектом. Самым оптимальным решением будет <strong>создать проект Windows Phone 8.1</strong> рядом в этом же Solution и максимально <strong>переиспользовать код</strong> на оба проекта. Второй вариант &ndash; в существующем проекте поправить ссылки на библиотеки автоматически, используя действие <strong>Retarget to Windows Phone 8.1</strong>. Но тогда вы получите Silverlight 8.1 приложение, а не XAML и лишитесь обратной совместимости. <a href="https://habrastorage.org/getpro/habr/post_images/8fe/1ef/82a/8fe1ef82a18ada7576feaea46e814c6b.png"><img src="https://habrastorage.org/getpro/habr/post_images/8fe/1ef/82a/8fe1ef82a18ada7576feaea46e814c6b.png" alt="" /></a> По этому пути мы не пойдем и будем создавать рядом еще одно приложение для Windows Phone 8.1. В Visual Studio нажимаем <strong>Add</strong> &ndash; <strong>New Project</strong>. В качестве шаблона проекта выбираем <strong>Blank App</strong>. <a href="https://habrastorage.org/getpro/habr/post_images/a27/571/add/a27571add87d378caa414102716a7222.png"><img src="https://habrastorage.org/getpro/habr/post_images/a27/571/add/a27571add87d378caa414102716a7222.png" alt="" /></a></p>
<h4>Перенос кода</h4>
<p>Нам очень повезло, что проект использует MVVM, код надежно отделен от интерфейса и у нас есть <strong>Portable Class Library</strong> где уже лежат вспомогательные классы и объекты. Если у вас этого нет, то вынесете модели, контроллеры и логику в PCL. Получится что-то близкое к структуре на картинке ниже. <a href="https://habrastorage.org/getpro/habr/post_images/c86/859/ae2/c86859ae2bde8756476d0fb229c18062.png"><img src="https://habrastorage.org/getpro/habr/post_images/c86/859/ae2/c86859ae2bde8756476d0fb229c18062.png" alt="" /></a> Подключаем готовый PCL к проекту для Windows Phone 8.1 и добавляем остальные используемые библиотеки. <a href="https://habrastorage.org/getpro/habr/post_images/23d/700/f07/23d700f07572514e4acd91af399da331.png"><img src="https://habrastorage.org/getpro/habr/post_images/23d/700/f07/23d700f07572514e4acd91af399da331.png" alt="" /></a> Теперь надо аккуратно копировать файлы из проекта Windows Phone 8.0 и устранять все что будет ломаться. Это не так быстро, как кажется, но достаточно рутинно. В скопированных файлах лучше поменять пространство имен, чтобы избежать конфликтов в Solution. Быстро это сделать можно используя возможность Find and Replace. <a href="https://habrastorage.org/getpro/habr/post_images/763/9dd/6ce/7639dd6ce83e0216372ed5e365eef0b8.png"><img src="https://habrastorage.org/getpro/habr/post_images/763/9dd/6ce/7639dd6ce83e0216372ed5e365eef0b8.png" alt="" /></a> Если ваше приложение Windows Phone 8.0 поддерживало несколько языков, и вы использовали файлы ресурсов для локализации, то важно знать, что в 8.1 просто в папке <strong>Resources</strong> их оставлять уже нельзя. Необходимо будет <strong>создать новые файлы ресурсов</strong> и перенести туда данные. <a href="https://habrastorage.org/getpro/habr/post_images/265/3c1/475/2653c14755531a5fe962f8d96bf6542a.png"><img src="https://habrastorage.org/getpro/habr/post_images/265/3c1/475/2653c14755531a5fe962f8d96bf6542a.png" alt="" /></a></p>
<h4>Перенос интерфейса</h4>
<p>Если попробовать скомпилировать и запустить приложение &ndash; нас постигнет неудача. Весь интерфейс в XAML файлах будет ругаться. В моём двухстраничном приложении 44 ошибки. К счастью, они все типовые и <strong>касаются пространств имен, элементов управления или их свойств</strong>. Новый Windows Phone 8.1 использует WinRT и там может <strong>не оказаться элементов управления и свойств, которые вы использовали в Silverlight Toolkit</strong>. <a href="https://habrastorage.org/getpro/habr/post_images/687/977/7ec/6879777ec151a6894a27b3d2daf155d3.png"><img src="https://habrastorage.org/getpro/habr/post_images/687/977/7ec/6879777ec151a6894a27b3d2daf155d3.png" alt="" /></a>Например:</p>
<ul>
<li>Открывающий тэг для страницы не <strong></strong>, a просто <strong></strong>.</li>
<li>Вместо <strong></strong> надо использовать <strong></strong>.</li>
<li>Многие стандартные стили будут не найдены и вам необходимо будет воссоздавать их руками.</li>
<li>Некоторые свойства у элементов управления изменились или вообще больше не существуют.</li>
</ul>
<p>В результате этого процесса, у меня получилось два практически одинаковых на вид приложения. Cлева Windows Phone 8.0, справа Windows Phone 8.1. <a href="https://habrastorage.org/getpro/habr/post_images/ab3/38b/242/ab338b242c63b5a0476b2b5b228ba20b.png"><img src="https://habrastorage.org/getpro/habr/post_images/ab3/38b/242/ab338b242c63b5a0476b2b5b228ba20b.png" alt="" /></a></p>
<h4>Создание проекта Windows Store</h4>
<p>После того, как приложение Windows Phone 8.1 заработает, можно пойти дальше и <strong>расширить его до Windows Store приложения</strong>, чтобы <strong>опубликовать в магазин Windows</strong>. Этот процесс не такой трудоемкий как предыдущий. Необходимо в контекстном меню проекта выбрать <strong>Add Windows 8.1</strong> <a href="https://habrastorage.org/getpro/habr/post_images/b23/f3c/54a/b23f3c54ae21e2d13ad7f65619033b44.png"><img src="https://habrastorage.org/getpro/habr/post_images/b23/f3c/54a/b23f3c54ae21e2d13ad7f65619033b44.png" alt="" /></a> Создастся два новых проекта: проект для Windows Store приложения и проект <strong>Shared</strong> для общего кода между Windows 8.1 и Phone 8.1 приложениями. <a href="https://habrastorage.org/getpro/habr/post_images/295/993/35d/29599335dc9b6772cbd0044918adec4f.png"><img src="https://habrastorage.org/getpro/habr/post_images/295/993/35d/29599335dc9b6772cbd0044918adec4f.png" alt="" /></a> В <strong>Shared</strong> проект можно перенести большую часть кода, a часть xaml превратить в элементы управления (user controls) и повторно использовать. <a href="https://habrastorage.org/getpro/habr/post_images/cd6/32d/379/cd632d379ff742126e5e8bad41546743.png"><img src="https://habrastorage.org/getpro/habr/post_images/cd6/32d/379/cd632d379ff742126e5e8bad41546743.png" alt="" /> </a> Если запустить Windows приложение, то оно будет так же очень похоже на Phone приложение и над более удобным дизайном придется еще поработать отдельно. <a href="https://habrastorage.org/getpro/habr/post_images/43c/bb6/b41/43cbb6b414e3e43ab1656cdefc0896ea.png"><img src="https://habrastorage.org/getpro/habr/post_images/43c/bb6/b41/43cbb6b414e3e43ab1656cdefc0896ea.png" alt="" /></a></p>
<h4>Заключение</h4>
<p>Мы получили три приложения: Windows Phone 8.0, Windows Phone 8.1 и Windows Store 8.1. Весь код и другие переиспользуемые файлы были вынесены из Windows Phone 8.1 и Windows Store проектов в Shared проект для общего кода или Portable Class Library. В проекте для Windows Phone 8.0 часть кода тоже была вынесена в PCL, но интерфейс и все возможности, требующие старого API остались в этом проекте. Скачать готовый пример можно тут:<a href="https://onedrive.live.com/download?resid=DA8C144CFF7C40EE%21160881"> Universal.zip</a> <a href="https://habrastorage.org/getpro/habr/post_images/3d0/f73/607/3d0f736077445c8785313c6893d41466.png"><img src="https://habrastorage.org/getpro/habr/post_images/3d0/f73/607/3d0f736077445c8785313c6893d41466.png" alt="" /></a></p>
<h4>Полезные ссылки</h4>
<p><a href="https://habrahabr.ru/company/microsoft/blog/229727/">Новая Windows Phone 8.1. Что делать Windows Phone 8.0 разработчику?</a> <a href="https://habrahabr.ru/company/microsoft/blog/230015/">Обновляем Windows Phone Silverlight 8.0 приложение до Windows Phone Silverlight 8.1</a> <a href="https://aka.ms/gomvarus">Бесплатные онлайн-курсы по технологиям</a> <a href="https://aka.ms/getvsrus">Загрузить бесплатную или пробную Visual Studio 2013</a> <a href="https://aka.ms/wpstartrus">Стать разработчиком приложений Windows Phone</a> <a href="https://code.msdn.microsoft.com/wpapps/Windows-Phone-81-samples-08631ca7">Примеры кода с основными возможностями Windows Phone 8.1 (c#, c++, javascript)</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>