Использование AdaptiveTrigger в Windows 10

Как и большинство разработчиков, я наблюдал за развитием Windows 10 и переваривал весь функционал, который Microsoft предоставила нам на конференции BUILD. И теперь я готов создавать UWP приложения (Universal Windows Platform). UWP это новая модель, которая позволяет писать приложения для широкого диапазона устройств Windows: настольных ПК, планшетов, телефонов, Xboxes, устройств IoT и даже HoloLens. Это будущее разработки.

В отличие от универсальных приложений для Windows 8.1, универсальные приложения для Windows 10 действительно являются универсальными. В Windows 8.1 универсальное приложение состояло (в Visual Studio), как правило, из одного общего проекта, двух “главных” и вспомогательных. В итоге построения решения производилось два двоичных файла: один для Windows и один для Windows Phone. В то время, как общий проект содержал общий код, который работал на обоих платформах, пользовательский интерфейс вы создали отдельно, как для Windows, так и для Windows Phone.

В Windows 10 все меняется и универсальность проявляется не только частично, а во всей своей красоте. В итоге, при построении мы получаем один двоичный файл — пакет APPX, который работает на любом устройстве UWP. К тому же у нас теперь не будет минимальных трех проектов (общий и два “главных”) — проект универсального UWP приложения содержит только один “главный” проект. Именно из-за этого ведется большое количество разговоров вокруг разработки адаптивных интерфейсов для такого рода приложений. Так как интерфейс, который хорошо выглядит на телефоне, скорее всего, не будет хорошо смотреться на 30″ настольном мониторе (и наоборот).

Одним из инструментов, который дает нам Microsoft для построения адаптивных интерфейсов в UWP приложениях является AdaptiveTrigger. У AdaptiveTrigger есть два главных и важных свойства: MinWindowWidth и MinWindowHeight. Вы можете использовать AdaptiveTrigger в сочетании с Visual State Manager и адаптировать пользовательский интерфейс для экранов различных размеров. Например, вы могли бы расположить основные части интерфейса горизонтально, но сделать выбор в пользу вертикальной планировки для телефонов. Благодаря AdaptiveTrigger и Visual State Manager вы можете сделать это в XAML без написания единой строки (C #) кода.

Ниже приведен простенький пример использование AdaptiveTrigger для изменения цвет фона элемента при изменении размера окна/экрана. Предположим, что ваша страница содержит базовый элемент (например Grid) с именем LayoutRoot, который растягивается на всю ширину и высоту страницы, и вы хотите установить цвет фона этого элемента до светло-желтого или светло-зеленый, в зависимости от ширины страницы , Вот то что вам понадобится для этого:

<VisualStateManager.VisualStateGroups>
  <VisualStateGroup x:Name="WindowStates">
    <VisualState x:Name="WideState">
      <VisualState.StateTriggers>
        <AdaptiveTrigger MinWindowWidth="800" />
      </VisualState.StateTriggers>
      <VisualState.Setters>
        <Setter Target="LayoutRoot.Background" Value="LightYellow" />
      </VisualState.Setters>                    
    </VisualState>
    <VisualState x:Name="NarrowState">
      <VisualState.StateTriggers>
        <AdaptiveTrigger MinWindowWidth="0" />
      </VisualState.StateTriggers>
      <VisualState.Setters>
        <Setter Target="LayoutRoot.Background" Value="LightGreen" />
      </VisualState.Setters>
    </VisualState>
  </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

Теперь фон будет светло-желтого цвета, когда ширина больше или равна 800 пикселям, а светло-зеленым, когда меньше. Вы можете попробовать данный код на настольном ПК Windows и вы увидите, что фон изменяется в реальном времени, когда ширина окна пересекает порог в 800 пикселей. Также обратите внимание на новое свойство сеттеров у VisualState элемента. Вместо того, чтобы использовать анимацию для изменения состояния, теперь вы можете использовать сеттеры для присвоения значений свойств напрямую. Это делает ваш XAML чище и более интуитивнее.

Чтобы показать более практическое применение AdaptiveTrigger, есть небольшое приложение, который вы можете скачать с OneDrive. Вот как это выглядит:

AdaptiveTriggerDemo (1)

AdaptiveTriggerDemo (2)

Один интерфейс определяется в одном XAML файле (MainPage.xaml), но интерфейс адаптируется к размерам экрана. Когда ширина экрана/окна больше или равна 800 пикселям — три основных составляющих макета (панель, содержащая рецепт, описание и изображение, панель с ингредиентами, и третья) — расположены бок о бок , Но когда ширина меньше 800 пикселей, пользовательский интерфейс изменяется так, чтобы три панели располагались друг под другом. (На скриншоте эмулятора вы можете видеть только верхнюю панель. Все три панели лежат в ScrollViewer, так что вы можете прокручивать вниз).

Далее необходимый нам XAML:

<Page
    x:Class="AdaptiveTriggerDemo.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:AdaptiveTriggerDemo"
    xmlns:comp="using:AdaptiveTriggerDemo.Components"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Page.Resources>
        <comp:ListConverter x:Key="ListConverter" />
    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <StackPanel Grid.Row="0" Margin="24,17,0,28">
            <TextBlock Text="Contoso Cookbook" Foreground="#C33D27" Style="{ThemeResource TitleTextBlockStyle}" Typography.Capitals="SmallCaps"/>
            <TextBlock Text="{Binding Title}" Margin="0,8,0,0" Style="{ThemeResource SubheaderTextBlockStyle}" TextWrapping="WrapWholeWords"/>
        </StackPanel>

        <ScrollViewer Grid.Row="1">
            <Grid Margin="0,-24,24,24">
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>

                <StackPanel x:Name="ImagePanel" Margin="24,24,0,0">
                    <Image Source="{Binding ImagePath}" HorizontalAlignment="Left" />
                    <TextBlock Text="{Binding Description}" FontSize="20" FontWeight="Light" TextWrapping="WrapWholeWords" Margin="0,8,0,8" />
                    <StackPanel Orientation="Horizontal">
                        <TextBlock FontSize="24" FontWeight="Light" Foreground="#C33D27" Text="{Binding PrepTime}" Margin="0,0,8,0"/>
                        <TextBlock FontSize="24" FontWeight="Light" Foreground="#C33D27" Text="minutes"/>
                    </StackPanel>
                </StackPanel>
                <StackPanel x:Name="IngredientsPanel" Margin="24,24,0,0">
                    <Rectangle Height="32" Fill="#C33D27" />
                    <TextBlock FontSize="26" Foreground="#C33D27" FontWeight="Light" Text="Ingredients" Margin="0,24,0,8"/>
                    <TextBlock FontSize="16" FontWeight="Light" Text="{Binding Ingredients, Converter={StaticResource ListConverter}}" TextWrapping="Wrap" />
                </StackPanel>
                <StackPanel x:Name="DirectionsPanel" Margin="24,24,0,0">
                    <Rectangle Height="32" Fill="#C33D27" />
                    <TextBlock FontSize="26" Foreground="#C33D27" FontWeight="Light" Text="Directions" Margin="0,24,0,8"/>
                    <TextBlock FontSize="16" FontWeight="Light" Text="{Binding Directions}" TextWrapping="Wrap" />
                </StackPanel>
            </Grid>
        </ScrollViewer>

        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="WindowStates">
                <VisualState x:Name="WideState">
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="800" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="IngredientsPanel.(Grid.Row)" Value="0" />
                        <Setter Target="IngredientsPanel.(Grid.Column)" Value="1" />
                        <Setter Target="DirectionsPanel.(Grid.Row)" Value="0" />
                        <Setter Target="DirectionsPanel.(Grid.Column)" Value="2" />
                        <Setter Target="ImagePanel.(Grid.ColumnSpan)" Value="1" />
                        <Setter Target="IngredientsPanel.(Grid.ColumnSpan)" Value="1" />
                        <Setter Target="DirectionsPanel.(Grid.ColumnSpan)" Value="1" />
                    </VisualState.Setters>
                </VisualState>
                <VisualState x:Name="NarrowState">
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="0" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="IngredientsPanel.(Grid.Row)" Value="1" />
                        <Setter Target="IngredientsPanel.(Grid.Column)" Value="0" />
                        <Setter Target="DirectionsPanel.(Grid.Row)" Value="2" />
                        <Setter Target="DirectionsPanel.(Grid.Column)" Value="0" />
                        <Setter Target="ImagePanel.(Grid.ColumnSpan)" Value="3" />
                        <Setter Target="IngredientsPanel.(Grid.ColumnSpan)" Value="3" />
                        <Setter Target="DirectionsPanel.(Grid.ColumnSpan)" Value="3" />
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
    </Grid>
</Page>

AdaptiveTrigger является единственным нововведенным триггером, включенным в Windows 10, но он предоставляется возможность с легкостью разрабатывать действительно гибкие интерфейсы пользователя, при всем этом еще и избавляясь от C# кода в странице.

 

Ссылка на источник: Using AdaptiveTrigger To Build Adaptive UIs In Windows 10

 

Tagged with: , , , ,
Опубликовано в Development, Windows 10

Uneta от 17.04.2015

После долгого перерыва мы снова имели возможность встретиться с вами на Uneta. На ней слушатели могли узнать, подробно разузнать об Entity Framework 7 от Александра Дехтяря и про нововведения ASP .NET 5  от Романа Алифиренко, а так же слушатели узнали, что нового уже успело появится в свежем SDK для Windows 10 в моем докладе “Windows 10 SDK”.

Кто не попал на презентацию, предлагаю вам ознакомится с ней.

Tagged with: , , ,
Опубликовано в Development, Windows 10

Первый взгляд на универсальную платформу разработки Windows 10

Совсем недавно на конференции Mobile World Congress в Барселоне, разработчикам было представлена Windows 10 платформа универсальных приложений под эту ОС.

Windows 10 представляет собой кульминацию данной платформы, сближение ОС Windows к чему-то единому, которая в настоящее время работает на одном едином унифицированном ядре Windows. Это сближение выдает нам в итоге одно приложение, которое будет запускаться на любом устройстве Windows: на телефоне в вашем кармане, планшете или ноутбуке в сумке, компьютере на рабочем столе, или консоли Xbox в гостиной. И это еще не упоминая все новые устройства, которые добавляются к семейству Windows, такие как: HoloLens, Surface Hub, устройства IoT (Raspberry Pi 2). Теперь у всех этих Windows устройствах будет доступ к одному магазину для установки/покупки приложений.

Для получения доступа к специфическому API устройства (например, телефона), универсальная платформа также будет предоставлять простой способ, без необходимости прибегать к помощи условных флагов компилятора.

Чтобы понять, почему Microsoft объединило Windows в одно ядро и создало одну платформу разработки, стоит рассматривать изменение отношения клиентов с их устройствами и т.п. Бурный рост количества мобильных устройств в течение последнего десятилетия привело к созданию совершенно нового уровня мобильных приложений и расширение существующих веб-решений, что позволяет разработчикам привлечь клиентов инновационным и уникальным способом.

Но это слишком узкое определение для растущего числа клиентов, которые хотят быть мобильным посредством всех своих устройств и использовать любые из них для каждой из задач.

Все эти выводы сделаны благодаря поисковым запросам пользователей в магазине. Еще год назад то, что искали пользователи Windows Phone, существенно отличалось от запросов с планшетов, которые в свою очередь отличались от ноутбуков и ПК, и игровой консоли. Ситуация изменилась очень быстро. Сегодня наиболее популярных поисковых запросов для каждого типа устройства буквально перекрывают друг друга, как между странами так и внутри приложений определенной категорий.

Gallo blog 1 v2

Как только Microsoft разработали платформу универсальных приложений, сразу же стал актуальный вопрос о поведении одного приложения на разных устройствах и именно этот опрос и стал одним из самых значительных. Они постарались обеспечить, чтобы все разработчики Windows в равной степени выиграют от одного ядра. Платформа позволяет разрабатывать приложения совершенно иного уровня — приложения, которые действительно пишутся один раз, с одним набором бизнес-логики и одним интерфейсом. Приложения, которые отправляются в один магазин, в одном пакете. Программы, которые можно устанавливать на каждое Windows 10 устройство. Новая платформа универсальных приложений завершает процесс сливания нескольких платформ воедино, предоставляя вам возможность, наконец, создать одно приложение, которое может работать как на мобильных, так и на настольных компьютерах, консоли и т.п.

Ну и конечно же не забывайте, что Windows 10 вы можете установить уже сейчас и принимать непосредственное участие в ее развитии. Осталось ждать совсем немного – уже летом мы увидим новую, совершенно другого уровня, революционную операционную систему

 

Ссылка на источник: A first look at the Windows 10 universal app platform

Tagged with: , , , ,
Опубликовано в Windows 10

Новые фичи C#

C# 6 поставляется с Visual Studio 2015 Preview. Философия этой версии проста: улучшить простые повседневные сценарии кодирования, не добавляя много концептуальных новых вещей. Новые возможности должны сделать процесс коддинга легче, при этом не делая язык тяжелее.

Сейчас я проведу вас через каждую новую особенность языка. Мы начнем на уровне экспрессии и будем двигаться «наружу». Можно быть уверенным, что это тот набор, который будет в конечном итоге, но уже известно, что некоторые из них несколько изменятся.

 

nameof выражения — новая форма строки, для которой потребуется больше синтаксиса и она более ограничена. Неужели что-то не нравится? 🙂

На самом деле есть много причин для того, чтобы полюбить данный функционал. Часто необходимо задать строку с именем некоторых элементов: например, когда бросаем ArgumentNullException и необходимо передать имя “виновного” в ошибке; при вызове события PropertyChanged и т.д.

Использование обычных строковых значений для данных целей является простым функционалом, но может вызвать ошибки. Вы можете неправильно записать имя или после рефакторинга оставить его устаревшим.

(if x == null) throw new ArgumentNullException(nameof(x));

Вы можете задать более сложное выражение в nameof, но это только для того, чтобы сообщить компилятору, где искать:

WriteLine(nameof(person.Address.ZipCode)); // выведет "ZipCode"

String interpolation позволяет вам более легко формировать строки. String.Format и его двоюродные братья очень универсальны, но их использование является несколько неуклюжим и приводящим к ошибкам. Особенно прискорбным является использование пронумерованных заполнителей, таких как “{0}”, в строке формата, которые должны совпадать с отдельно указанными аргументами:

var s = String.Format("{0} is {1} year{{s}} old", p.Name, p.Age);

String interpolation позволяет поместить выражения прямо на их место:

var s = "\{p.Name} is \{p.Age} year{s} old";

Так же, как и со String.Format, есть возможность добавить дополнительные выравнивания и форматы:

var s = "\{p.Name,20} is \{p.Age:D3} year{s} old";

Содержание таких “вставок” могут быть различные, например, тернарное выражение:

var s = "\{p.Name} is \{p.Age} year\{(p.Age == 1 ? "" : "s")} old";

Обратите внимание, что условное выражение в скобках.

Примечание: здесь описывается синтаксис, который работает в VS Preview. Тем не менее, синтаксис скорее всего будет изменен и в более поздних версиях вы увидите интерполированные строки, написанные таким образом:

var s = $"{p.Name,20} is {p.Age:D3} year{{s}} old";

 

Null-conditional operators решает многие ситуации, когда нам приходилось проверять переменные null перед обращением к ним. Такие операции позволяют получить доступ к элементу только тогда, когда он не является нулевым, иначе обеспечивает нулевой результат:

int? length = customers?.Length; // null если customers null
Customer first = customers?[0];  // null если customers null

Данный оператор очень  удобно использовать вместе с со следующим оператором “??”:

int length = customers?.Length ?? 0; // 0 если customers null

Также можно смело прописывать функционал после данного оператора — если изначальное условие не будет выполняться — он прекратит работу и вернет null:

int? first = customers?[0].Orders.Count(); // если customers null, то результат будет null

По сути следующий пример — то же самое:

int? first = (customers != null) ? customers[0].Orders.Count() : null;

Также таким образом мы можем проверять на null дальнейшие обращения:

int? first = customers?[0].Orders?.Count();

Обратите внимание, что вызов (передача параметров в скобках) не может следовать сразу после оператора ‘?’ — т.к. это приведет к слишком многим синтаксических двусмысленностям:

if (predicate?(e) ?? false) { … } // Error!!

Тем не менее, вы можете запустить это сценарий с помощью метода Invoke:

if (predicate?.Invoke(e) ?? false) { … }

Это простой и потокобезопасный способ проверить на null, прежде чем вызвать событие.

 

Index initializers  призвано расширить инициализацию объектов во вновь созданном объектом:

var numbers = new Dictionary<int, string> {
   [7] = "seven",
   [9] = "nine",
   [13] = "thirteen"
};

 

Exception filters — способность CLR, которая уже давно реализована для  Visual Basic и F #,  но не было для C#. Выглядит это следующим образом:

try { … }
catch (MyException e) if (myfilter(e))
{
…
}

Если выражение в скобках после «if» истинно, catch сработает.

 

Await в catch и в finally который был невозможен до сих пор. На самом деле это было существенным ограничением и люди приходилось использовать обходные пути (костыли). Но теперь Вы можете обойтись без них:

Resource res = null;
try
{
   res = await Resource.OpenAsync(…); // You could always do this.
   …
}
catch(ResourceException e)
{
   await Resource.LogAsync(res, e); // Now you can do this …
}
finally
{
   if (res != null) await res.CloseAsync(); // … and this.
}

 

Auto-property initializers появилась в новой версии языка; подобна инициализации полей:

public class Customer
{
   public string First { get; set; } = "Jane";
   public string Last { get; set; } = "Doe";
}

 

Getter-only auto-properties позволяют опускать функционал сеттер в авто-свойствах:

public class Customer
{
   public string First { get; } = "Jane";
   public string Last { get; } = "Doe";
}

Поле по сути будет являться ReadOnly. Оно может быть инициализировано через инициализацию при определении (как в примере выше) или же оно может быть установлено в какое-либо значение в теле конструктора объявляющего типа, которое присваивается непосредственно к основной области:

public class Customer
{
      public string Name { get; };
      public Customer(string first, string last)
      {
          Name = first + " " + last;
      }
}

 

Expression-bodied function members позволяют определять методы, свойства и другие виды функций-членов в виде выражений, а не блоков, так же, как с лямбда-выражениями.

Тело методы могут быть представлено выражением с использованием лямбда-выражения:

public Point Move(int dx, int dy) => new Point(x + dx, y + dy);
public static Complex operator +(Complex a, Complex b) => a.Add(b);
public static implicit operator string(Person p) => "\{p.First} \{p.Last}";

Эффект в точности такой же, как если бы у методов были блоковые тела.

public void Print() => Console.WriteLine(First + " " + Last);

Свойства и индексаторы могут иметь  только get или get/set методы и у индексаторов могут быть только тела выражении:

public string Name => First + " " + Last;
public Customer this[long id] => store.LookupCustomer(id);

 

Parameterless constructors in structs допускаются в данный момент:

struct Person
{
   public string Name { get; }
   public int Age { get; }
   public Person(string name, int age) { Name = name; Age = age; }
   public Person() : this("Jane Doe", 37) { }
}

Выражение “new Person()” будет выполнять заявленный конструктор вместо стандартного поведения предоставления значение по умолчанию. Необходимо подметить, что «default(Person)» будет по-прежнему возвращать значение по-умолчанию.

 

using static — новый вид using, которое позволяет импортировать статические члены типов непосредственно.

В Preview выглядит следующим образом:

using System.Console; 
using System.Math;
class Program
{
   static void Main()
   {
       WriteLine(Sqrt(3*3 + 4*4));
   }
}

Это очень удобно, если у вас есть набор функций, относящихся к определенному пространству имен, например, System.Math.


Ссылка на источник: New Features in C# 6

Tagged with: , , , , , , ,
Опубликовано в .Net, Development

Play To. Часть 2

Сегодня мы продолжим рассмотрение контракта Play To: узнаем как его реализовать программно, посмотрим на существующие примеры и узнаем, что делать хорошо, а что нет. Первую часть Вы можете найти здесь.

Для чего нужен PlayTo контракт?

Реализация  Play To очень проста и состоит из нескольких следующих пунктов:

  1. Получение объекта PlayToManager для текущего отображения.
  2. Подписка на событие SourceRequested.
  3. Установите PlayToSource из медиа-элемента. На основе типа распространяемого элемента (видео, аудио и т.п.) система показывает только те устройства, которые могут принимать этот тип медиа. Если пользователь выбирает устройство, PlayToSource отправляется ему.

Давайте рассмотрим простой пример, как включить воспроизведение для одного медиа-элемента.

JavaScript
<video id="videoplayer" src="http://www.contoso.com/clip.mp4" controls autoplay />
<script type="text/javascript">
  // Step 1: Obtain PlayToManager object for app’s current view.
  var ptm = Windows.Media.PlayTo.PlayToManager.getForCurrentView();
  // Step 2: Register for the sourcerequested event (user selects Devices button).
  ptm.addEventListener("sourcerequested", function(e) {
      var request = e.sourceRequest;

      // Step 3: Specify the media to be streamed (to filter devices)
      request.setSource(document.getElementById("videoplayer").msPlayToSource);
      // The media will then be streamed to the device chosen by the user in the UI.
  });
</script>
XAML
<MediaElement x:Name="videoplayer" 
                 Source="http://www.contoso.com/clip.mp4"
                 AutoPlay="true" />
// Step 1: Obtain PlayToManager object for app’s current view.
PlayToManager ptm = Windows.Media.PlayTo.PlayToManager.GetForCurrentView();

// Step 2: Register for the SourceRequested event (user selects Devices button).
ptm.SourceRequested += (PlayToManager sender, PlayToSourceRequestedEventArgs e) => {
  request = e.SourceRequest;

  // Step 3: Specify the media to be streamed.
  PlayToSourceDeferral deferral = request.GetDeferral();
  request.SetSource(videoplayer.PlayToSource);
  deferral.Complete();
}
// The media will then be streamed to the device chosen by the user in the UI.

Как и что необходимо делать?

Если ваше приложение содержит в себе интересные фотографии, музыку или видео, которые могут выглядеть лучше на большом экране и/или высококачественном стерео — у Вас есть смысл использовать Play To контракт.

Play To автоматически включается для приложений, которые воспроизводят музыку и/или видео (но не организовывают просмотр изображений). Этот функционал по-умолчанию отлично работает для отдельных медиа-элементов; однако, возможности Play To позволяют нам намного больше, например, слайд-шоу и плейлисты.

Потоковая передача Play To поддерживает все музыкальные файлы, видео и изображения, которые не находятся под защитой DRM.

Для этого поста я использую стандартное приложение “Фотографии”, как пример прекрасной реализации контракта Play To.

 

Пример

Пользователи могут открывать правую панель и выбрать пункт “Устройства”, и увидеть совместимые устройства из любой точки приложения. Всякий раз, когда пользователь просматривает фото, видео и т.п. у него будет возможность открыть правую панель и просмотреть параметры устройства. Так же пользователи могут отправлять весь альбом на другое устройство для просмотра и т.п..

В данном примере пользователь должен выбрать фото и видео, которые будут  отправлены на телевизор. Когда пользователь открывает пункт “Устройства” в правой панели они увидят доступные устройства, которые могут принимать передаваемый тип содержимого.

skate_park

Вот как приложение выглядит, когда оно работает с телевизором:После того как пользователь выбирает устройство он хочет знать, что именно ретранслируется на него из приложения в данный момент. Приложение “Фотографии” подчеркивает такой элемент прямоугольником вокруг него.

skate_park2

Создание слайд-шоу

Сертифицированные Microsoft Play To устройства поддерживают пребуферизацию следующего элемента. Передача устройству в буфер следующего элемента воспроизведения  — отличный способ обеспечить высокую производительность, которая имеет решающее значение для большинства пользователей. Приложения могут воспользоваться этой возможностью, указав источник для «следующего» элемента в Play To. По данной ссылке Вы сможете найти пособие по быстрой реализации данного функционала.

 

Поддержка воспроизведения

Play To сессия продолжает играть до тех пор, пока пользователь не отключит ее. Это обеспечивается благодаря двум сценариям многозадачности:

  1. Пользователи могут перемещаться между разными фотоальбомами в том же приложении. Поддержка данного сценария требует от приложения возможность продолжать работать при уходе со страницы «Now Playing». Например, в приложении “Фотографии” пользователи могут выбрать несколько фотографий и обмениваться ими по электронной почте, а слайд-шоу продолжает играть на телевизоре, или вы можете искать следующий список фотографий для показа, при этом не прерывая слайд-шоу.
  2. Пользователи могут переключиться на другое приложение, например, чтобы проверить электронную почту, в то время как слайд-шоу продолжает транслироваться на телевизор. В этом случае приложение ничего не делает. Windows автоматически поддерживает работу приложения в фоновом режиме во время работы Play To. У приложения есть примерно 10 секунд для того, чтобы отправить новое изображение после предыдущего и приблизительно 10 секунд для того, чтобы послать следующее аудио или видео после окончания текущего иначе сеанс оборвется. Когда активная трансляция обрывается/заканчивается — Windows приостанавливает приложение.

 

Что можно и нельзя делать?

Можно:

  • Сообщать пользователю, что ваше приложение транслирует контент на другое устройство.
  • Положитесь на функционал “Устройства” для подключения к устройствам (и отключения).
  • Поддерживайте сессию Play To активной при переключении пользователя на другие приложения.
  • При воспроизведении музыки, фотографий и видео, обязательно указывайте следующий элемент PlayToSource для повышения производительности.

Нельзя:

  • Добавлять пользовательские кнопки для начала и/или окончания Play To. Пользователь все должен сделать сам с помощью функционала “Устройства” в правой панели.

 

Что на счет веб-страниц?

Подобно приложениям Play To автоматически включается для музыки, видео и изображений в IE10. Он, в свою очередь, пытается определить самый лучший элемент медиа для трансляции посредством Play To; элементы, которые в данный момент транслируются на другое устройство, гаходятся в фокусе.

Музыка и видео, длина которых не достигает и 5 секунд (включительно), и изображения, которые меньше 300х300 пикселей (включительно), игнорируются IE и никогда не включаются автоматически.

По данной ссылке Вы сможете найти больше информации по поводу использования Play To для веб-страниц

 

Немного о форматах

Все форматы, с которыми Windows “дружит” Вы сможет найти здесь. Но для лучшей производительности рекомендуется использовать 1080р для изображений,  720p (или 1080) для MP4 видео — с H264 и AAC аудио.

 

На этом наш рассказ о таком прекрасном функционале как Play To заканчивается. Радуйте своих пользователей новым интересным и полезным функционалом!

 

Ссылка на источник: Enabling great Play To experiences from your Windows 8 apps (and websites!)

Tagged with: , , , , ,
Опубликовано в Development, Windows 8.1

Play To. Часть 1

В первой части мы поверхностно познакомимся с контрактом  Play To, о котором мало кто знает и мало кто реализует, но на самом деле он очень и очень интересный и полезный для пользователя.

Обзор Play To

Функционал PlayTo позволяет передавать музыку, фотографии и видео с приложений на Xbox и другие поддерживаемые устройства, которые находятся в домашней сети. Представьте себе возможность с легкостью отобразить фотографии и видеозаписи с вашего приложения на телевизоре с большим экраном или музыку из вашего приложения на музыкальный центр в гостиной. Использование данного контракта позволит легко включить данные сценарии в обиход ваших пользователей. Это отличный способ сделать ваши приложения более привлекательными для пользователей.

Play To предоставляет…:

  • Пользователи: В сетях, в которых пользователи включили общий доступ (например, домашние сети), Windows 8 автоматически обнаруживает Windows Certified Play To устройства. Операционная система предоставляет единый пользовательский интерфейс, благодаря которому пользователи, используя всего два движения (сдвиг (swipe) и нажатия), могут запустить функционал Play To из любого поддерживаемого приложения. У всех медиа-приложений от Miscrosoft есть встроенная поддержка Play To (Музыка, Видео, Фотографии). Даже Internet Explorer 10 реализует Play Tо контракт, так что пользователи могут ретранслировать фотографии и HTML5 музыку/видео с веб-страниц.
  • Разработчики: для разработчиков Play To контракт является абстракцией высокого уровня потоковой ретрансляции (протоколов, форматов согласования, транскодирования и т.д.), и позволяет реализовывать все это очень быстро и легко.
  • Устройства: Play To контракт предназначен для работы с Windows certified Play To устройствами. Сертифицированные устройства обеспечивают последовательную и надежную работу. Есть ряд компаний, работающих над Play To сертификацией для своих устройств, располагающихся в различных категориях: телевизоры, приставки, громкоговорителей, звуковые приемники и т.п.

Разработка привлекательных и интерактивных приложений

Play To позволяет расширить возможность работы Вашего приложения до многоэкранного режима, что, конечно же, заставит его выделиться в Windows Store. При реализации Play To вы получаете:

  • Социальные возможности — пользователи могут легко обмениваться своими любимыми фотографиями и видеозаписями с друзьями и семьями на большой домашнем экране прямо из вашего приложения;
  • Сопутствующие возможности — приложение может обеспечить возможности второго экрана.

В этой статье мы используем обычный пример с сайта msdn и стандартное приложение фотографий в качестве примера.

 

Как это работает?

Давайте сначала рассмотрим данный функционал на примере обычного пользователя — подключитесь к новой сети для передачи потока данных на другое устройство.

В Windows 8 установка Play To очень простая — без ущерба для конфиденциальности пользователя и безопасна в сетях общего использования. Обмен автоматически включается на компьютерах, которые находятся в Домашней группе, и на ПК, где пользователь выбрал Экспресс настройки во время первого запуска системы. Кроме того, при любом подключении к новой сети у пользователя спрашивают, хочет ли он разрешить общий доступ и подключение к устройствам. Пользователи также могут вызвать это сообщение снова, путем нажатия и удерживания на имя сети.

start_screen_sharing

После того, как пользователь разрешил шаринг Windows автоматически находит и устанавливает поддерживающиеся устройства в сети в пределах 30 секунд. Пользователи могут посмотреть доступность устройства в соответствующем пункте в настройках компьютера. Пользователь также может вручную добавлять новые устройства.

pcsettings_screen

После того как Play To устройства установлены, Windows запоминает их и автоматически отслеживает их доступность в сети.

Давайте посмотрим по-ближе на примере стандартного примера для разработчиков.

big_buck

Что бы посмотреть как это приложение реализует Play To контракт, мы можем сдвинуть правую панель и посмотреть доступные устройства.

big_buck2

Как только вы выберете устройство — Play To начнет свою работу. В этом случае мы выбираем Xbox 360, и как вы можете видеть контрол управления видео переходит в режим когда видео сменяется серым фоном. Пауза, воспроизведение, перемотка и кнопки регулирования громкости теперь работают на целевом устройстве.

playto_stream

Пользователь может завершить данную сессию путем разрыва соединения

playto_stream2

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

Ссылка на источник: Enabling great Play To experiences from your Windows 8 apps (and websites!)

Tagged with: , , , ,
Опубликовано в Development, Windows 8.1

Работа с документами: как (не) использовать возможности documentsLibrary в Windows Store приложениях

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

Эта возможность не предназначена для того, чтобы приложения использовали библиотеку документов для общего хранения или программно просматривали ее. Мы настоятельно рекомендуем вам избегать использования этой возможности.

 

Но что же делать, если этот функционал необходим?

 

Хорошей новостью является то, что большинству приложений будет лучше без documentsLibrary. Вместо этого позвольте пользователю выбрать, какие папки использовать. В первый раз, когда необходимо сохранить документ, используйте FolderPicker, чтобы позволить пользователю выбрать место сохранения и запомните выбранное расположение с помощью FutureAccessList.

Для получения более подробной информации о FolderPicker смотрите Quickstart: Accessing files with file pickers и File picker sample. Для получения дополнительной информации о кэширования доступа к файлам см How to track recently used files and folders и File access sample.

 

Ссылка на источник: Dealing with Documents: How (not) to use the documentsLibrary capability in Windows Store apps

Tagged with: , , ,
Опубликовано в Development, Windows 8.1