Top Banner
Programowanie Windows 8 Bartłomiej Zass Technical Evangelist Microsoft Polska
217

Programowanie aplikacji dla Windows 8 (WinRT)

Nov 28, 2014

Download

Technology

Podstawy tworzenia aplikacji dla Windows 8 (Modern UI) w XAML, C# i komponentach WinRT.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Programowanie aplikacji dla Windows 8 (WinRT)

Programowanie Windows 8

Bartłomiej ZassTechnical EvangelistMicrosoft Polska

Page 2: Programowanie aplikacji dla Windows 8 (WinRT)

Na czym się skupimy?

Trochę o pisaniu w HTML 5 XAML i Windows 8 ASP.NET (czasem trochę) - C# (jeśli zdążymy) - Windows Phone

Page 3: Programowanie aplikacji dla Windows 8 (WinRT)

MS-DOS Executive, 1985 r.

Niepełny OS – tylko warstwa na MS-DOS

Page 4: Programowanie aplikacji dla Windows 8 (WinRT)

Windows 95

Win32 – uzupełnianie granicy między 16-biti 32-bit

Page 5: Programowanie aplikacji dla Windows 8 (WinRT)

Hello, world w C++

#include<iostream.h>int main(){ cout << "Hello World" << endl; return 0;}

Page 6: Programowanie aplikacji dla Windows 8 (WinRT)

Hello, World w Win32 (MFC)#include <afxwin.h>class HelloApplication : public CWinApp{public:virtual BOOL InitInstance();};HelloApplication HelloApp;class HelloWindow : public CFrameWnd{CButton* m_pHelloButton;public:HelloWindow();};BOOL HelloApplication::InitInstance(){m_pMainWnd = new HelloWindow();m_pMainWnd->ShowWindow(m_nCmdShow);m_pMainWnd->UpdateWindow();return TRUE;}HelloWindow::HelloWindow(){Create(NULL,"Hello World!",WS_OVERLAPPEDWINDOW|WS_HSCROLL,CRect(0,0,140,80));m_pHelloButton = new CButton();m_pHelloButton->Create("Hello World!",WS_CHILD|WS_VISIBLE,CRect(20,20,120,40),

Page 7: Programowanie aplikacji dla Windows 8 (WinRT)
Page 8: Programowanie aplikacji dla Windows 8 (WinRT)

COM – od 1993

Model komponentowy Wygodniej i łatwiej w VB

Komunikacja między procesami C -> brak obiektów C++ -> współdzielenie kodu między programistami COM -> komunikacja między procesami SOA -> komunikacja między usługami, systemami

Page 9: Programowanie aplikacji dla Windows 8 (WinRT)

.NET Framework

Prace od 1990 r. Next Generation Windows Services (NGWS) Pierwsza beta – 2000 r. MSIL, CLR, CTS, Garbage Collector, … Windows Forms

GDI/GDI+ - bezpośredni dostęp do hardware’u 2006 r. - .NET Framework 3.0

WPF – Windows Presentation Foundation XAML

Page 10: Programowanie aplikacji dla Windows 8 (WinRT)
Page 11: Programowanie aplikacji dla Windows 8 (WinRT)

NUI

iPad – 2010 r. 15 milionów urządzeń w pierszym roku

Natural User Interface (NUI) Historia maszyny do pisania (1870 r.) – Christopher Sholes Mysz – 1960r., Xerox

Kiedy jedno kliknięcie, kiedy dwa, … iPhone (2007 r.), Nintendo Wii, … Kinect – 2009 r. Obecnie – konsumeryzacja IT (Gartner), BYOD

Page 12: Programowanie aplikacji dla Windows 8 (WinRT)

Windows Store Application

Page 13: Programowanie aplikacji dla Windows 8 (WinRT)

WinRT

W przeciwieństwie do Win32 – object oriented Wiele języków COM, projekcje DirectX zamiast GDI Application Container i zamrażanie (w desktop przesłonięte działa) Bezpośrednie wywołania do kernela lub brokered call

Page 14: Programowanie aplikacji dla Windows 8 (WinRT)

WinRT

Page 15: Programowanie aplikacji dla Windows 8 (WinRT)

WinRT – c.d.

Oparte o COM Zgodne z Application Binary Interface (ABI) – interface między

systemem i komponentami Iinspectable, Iunknown

Reference counting Javascript – własny garbage collector .NET – COM Interop, komunikacja przy pomocy Runtime Callable

Wrapper (RCW)

Page 16: Programowanie aplikacji dla Windows 8 (WinRT)

Wiele typów urządzeń

Page 17: Programowanie aplikacji dla Windows 8 (WinRT)

DemoWindows 8

Page 18: Programowanie aplikacji dla Windows 8 (WinRT)

Modern UI

Page 19: Programowanie aplikacji dla Windows 8 (WinRT)

Windows Store

Page 20: Programowanie aplikacji dla Windows 8 (WinRT)

Duży zasięg

Integracja z przeglądarką

Transparentny proces

Różne modele biznesowe

Wysoki zysk dla programistów

Windows Store

Page 21: Programowanie aplikacji dla Windows 8 (WinRT)

Integracja z IE

Get the app / switch to the app <meta name="msApplication-ID"content="microsoft.build.App"/> <meta name="msApplication-PackageFamilyName"content="microsoft.build_8wekyb3d8bbwe"/>

Pinned sites Badges Polling

<META name="msapplication-badge" content="frequency=30; polling-uri=http://mysite.com/id45453245/polling.xml"/>

Ręczne odświeżenie z JS window.external.msSiteModeRefreshBadge();

<badge value = "1-99" | "none" | "activity" | "alert" | "available" | "away" | ... version? = integer />

Link previews (share) - thumbnail Direct invoke

Page 22: Programowanie aplikacji dla Windows 8 (WinRT)

Sideloading Warunki

Windows 8 Enterprise lub Windows Server 2012 Dołączenie do domeny

Windows 8 Pro, Windows RT lub nie dołączony do domeny Zakupiony Sideloading Product Activation Key

Visual Studio Express ;) Uwaga: teoretycznie monitorowane

Instalacja Per user – skrypty powershell Przygotowany obraz przez IT

Podpisanie aplikacji zaufanym certyfikatem Group Policy

Wymagane: Allow all trusted applications to install Dostęp do Windows Store i aktualizacji (np. zablokowanie)

Page 23: Programowanie aplikacji dla Windows 8 (WinRT)

Sideloading - group policy

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Appx\AllowAllTrustedApps = 1

Page 24: Programowanie aplikacji dla Windows 8 (WinRT)

Sideloading – c.d.

Wgranie certyfikatu użytego do podpisania aplikacji PowerShell

import-module appx add-appxpackage \\udziałsieciowy\app1.appx Get-AppxPackage –AllUsers (listuje pakiety) Remove-AppxPackage Package1

DISM /Online /Add-ProvisionedAppxPackage /PackagePath:C:\App1.appx /SkipLicense (przygotowanie obrazu)

Page 25: Programowanie aplikacji dla Windows 8 (WinRT)

Windows Store

Domyślny trial + zakupy – odblokowane dla wszystkich kont GetAppReceiptAsync – per device, per user

AppReceipt ProductReceipt Signature https://go.microsoft.com/fwlink/?

LinkId=246509&cid=b809e47cd0110a4db043b3f73e83acd917fe1336

Page 26: Programowanie aplikacji dla Windows 8 (WinRT)

Receipt<Receipt Version="1.0" ReceiptDate="2012-08-28T22:11:33Z" CertificateId="b809e47cd0110a4db043b3f73e83acd917fe1336"

ReceiptDeviceId="4e362949-acc3-fe3a-e71b-89893eb4f528">

<AppReceipt Id="8ffa256d-eca8-712a-7cf8-cbf5522df24b" AppId="55428GreenlakeApps.CurrentAppSimulatorEventTest_z7q3q7z11crfr" PurchaseDate="2012-06-04T23:07:24Z" LicenseType="Full" />

<ProductReceipt Id="2559fa9a-9f86-0525-e655-536a6c96fac6" ProductId="Product1" PurchaseDate="2012-06-04T23:07:50Z" ExpirationDate="2012-06-07T23:07:49Z" ProductType="Durable" AppId="55428GreenlakeApps.CurrentAppSimulatorEventTest_z7q3q7z11crfr" />

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">

<SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> <Reference URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> <DigestValue>npmBq7pdtq9FkfILSsHuVyD+QWiZg6J/klBKsyWhrw8=</DigestValue> </Reference> </SignedInfo>

<SignatureValue>LKZSHmk6XjLaEHoJPFBB1GxVsFf2(...) 9PiVyBEOlZw==</SignatureValue></Signature>

Page 27: Programowanie aplikacji dla Windows 8 (WinRT)

Windows 8 PlatformWindows Store Apps

HTMLJavaScript

CC++

C#VB

Desktop Apps

Win32 .NET / SL

Internet Explorer

Communication & Data

Application Model

Devices & Printing

WinRT APIs

Graphics & Media

Syst

em S

ervi

ces

JavaScript(Chakra)

CC++

C#VB

XAML HTML / CSSView

Mod

el

Cont

rolle

r

Windows Core OS ServicesCore

Page 28: Programowanie aplikacji dla Windows 8 (WinRT)

WinRT API z bliska

Fundamentals

Application Services Threading/Timers Memory Management Authentication Cryptography Globalization

DevicesGeolocation Portable Sensors NFC

User Interface

SVG Tiles Input Accessibility Printing

HTML5/CSS XAML DirectX Controls Data Binding

Communications & Data

Memory Management XML Networking SMS

Notifications Streams

Contracts Local & Cloud Storage Web

MediaPlayback Capture PlayTo Visual Effects

Page 29: Programowanie aplikacji dla Windows 8 (WinRT)

WinRT

Aplikacja jest też komponentem HKEY_CURRENT_USER→Software→Classes→Activatable

Classes→Package Dane paczki, host uruchomieniowy

HKEY_CURRENT_USER→Software→Classes→Extensions→ContractId Kontrakty Tile – tak naprawdę Launch contract

Page 30: Programowanie aplikacji dla Windows 8 (WinRT)

Kilka przykładów użycia Javascript...

Aplikacje dla Windows 8 Gry – np. Cut The Rope, Angry Birds PhoneGap Node.js Sharepoint Rozszerzenia Office 2013 Azure Mobile Services Inne ciekawostki

http://jscriptlinq.codeplex.com/ - LINQ w JS http://bellard.org/jslinux/ - implementacja Linux w JS

Page 31: Programowanie aplikacji dla Windows 8 (WinRT)

DemoTypescript

Page 32: Programowanie aplikacji dla Windows 8 (WinRT)

HTML 5 i Windows 8

Page 33: Programowanie aplikacji dla Windows 8 (WinRT)

Windows 8 – akcelerowana platforma HTML

CSS 2D Transforms

CSS 3D Transforms

CSS Animations

CSS Backgrounds & Borders

CSS Color

CSS Flexbox

CSS Fonts

CSS Grid Alignment

CSS Hyphenation

CSS Image Values (Gradients)

CSS Media Queries

CSS multi-column Layout

CSS Namespaces

CSS OM Views

CSS Positioned Floats (Exclusions)

CSS Selectors

CSS Transitions

CSS Values and Units

Data URI

DOM Element Traversal

DOM HTML

DOM Level 3 Core

DOM Level 3 Events

DOM Style

DOM Traversal and Range

DOMParser and XMLSerializer

ECMAScript 5

File APIs

FormData

HTML5 Application Cache

HTML5 async

HTML5 Canvas

HTML5 Drag and drop

HTML5 Forms and Validation

HTML5 Geolocation

HTML5 History API

HTML5 Parser

HTML5 Sandbox

HTML5 Selection

HTML5 semantic elements

HTML5 video and audio

ICC Color Profiles

IndexedDB

Page Visibility

Pointer (Mouse, Pen, and Touch) Events

Selectors API Level 2

Filter Effects

SVG, standalone and in HTML

Timing callbacks

Web Messaging

Web Sockets

Web Workers

XHTML/XML

XMLHttpRequest (Level 2)

Page 34: Programowanie aplikacji dla Windows 8 (WinRT)

Najpopularniejsze cechy HTML5Web Sockets

Web Workers

IndexedDB

Ecmascript 5

File API & Blobs

Geolocation

Audio tag

Video tag

Touch-first

Pointer events

Zoom regions

Snap Points

Forms

Validation

Input types

Spell checking

Page 35: Programowanie aplikacji dla Windows 8 (WinRT)

DemoIE 10 i HTML 5, CSS 3

Page 36: Programowanie aplikacji dla Windows 8 (WinRT)

WinJS

Helpers for Namespaces, Constructor Definition

Promises

App Model

Navigation

Page & User controls

Data binding

Controls

Animations

Templates

Utilities

Default CSS Styles

Page 37: Programowanie aplikacji dla Windows 8 (WinRT)

jQuery, XHR i local context

jQuery xhr robi cross-domain check (wer. > v1.6) W kontekście lokalnym, jesteśmy w “ms-wwa://{something}” Błąd przy cross domain check

Workaround Skorzystaj z WinJS XHR Powiedz jQuery aby pominąć weryfikację

$.support.cors = true; http://api.jquery.com/jQuery.support/

Page 38: Programowanie aplikacji dla Windows 8 (WinRT)

Zabezpieczenia hosta

Zabezpieczenie przed wstrzykiwaniem “złego” HTMLa Skrypty, iframes, event handlers, itp.

Wywyływane gdy korzystamy z innerHTML outerHTML setAdjacentHTML

Atrybuty “data-” również nie są dozwolone Specyficzne dla WinJS są OK

Page 39: Programowanie aplikacji dla Windows 8 (WinRT)

Wyłączenie zabezpieczeń

toStaticHTML method DOM creation APIs WinJS.Utilities.setInnerHTMLUnsafe msWWA.execUnsafeLocalFunction

Page 40: Programowanie aplikacji dla Windows 8 (WinRT)

DemoWindows 8 i HTML

Page 41: Programowanie aplikacji dla Windows 8 (WinRT)

XAML - podstawy

Page 42: Programowanie aplikacji dla Windows 8 (WinRT)

XAML - podstawy

Dialekt XML Wprowdzony przez WPF, następnie Silverlight, Windows Phone,

Windows 8 Także inne technologie (składniowo) – np. WF Drzewo kontrolek Style, animacje, bindingi

Page 43: Programowanie aplikacji dla Windows 8 (WinRT)
Page 44: Programowanie aplikacji dla Windows 8 (WinRT)

Zdarzenia

W WPF różne – routed, bubbling, tunnel, … W Silverlight / Windows Phone / Windows 8 – routed

Zdarzenie wędruje w górę drzewa Można je zatrzymać – e.Handled = true

Page 45: Programowanie aplikacji dla Windows 8 (WinRT)

Hierarchia klas

Dependency Object (dependency property system) UIElement (klawiatra, touch, …)

FrameworkElement (layout, loaded / unloaded, binding, style)

Page 46: Programowanie aplikacji dla Windows 8 (WinRT)

Dependency Property

public static readonly DependencyPropertyMyNumberProperty = DependencyProperty.Register("MyNumber",typeof (int),typeof (MyDependencyObject),new PropertyMetadata(2, OnMyNumberPropertyChange));

Page 47: Programowanie aplikacji dla Windows 8 (WinRT)

Attached Property

Doklejanie swoich atrybutów do innych kontrolek Wszystkie inne zalety DP (style, animacje, itp.)

var row = ValueText.GetValue(Grid.RowProperty);

Opakowanie jakiejś funkcjonalności

Wspierane przez designer

Page 48: Programowanie aplikacji dla Windows 8 (WinRT)

Attached Property

public static readonly DependencyProperty IsShareButtonProperty =DependencyProperty.RegisterAttached("IsShareButton",typeof(Boolean),typeof(MagicButton),new PropertyMetadata(false,new PropertyChangedCallback(Changed)));

Page 49: Programowanie aplikacji dla Windows 8 (WinRT)

<Grid.DataContext><local:MyDependencyObject/>

</Grid.DataContext>

Page 50: Programowanie aplikacji dla Windows 8 (WinRT)

Bindowanie

POCO WinRT + BindbleAttribute lub ICustomPropertyProvider

<TextBlock Text="{Binding ElementName=Slider, Path=Value}"/><TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Path=FontSize}"/>

Page 51: Programowanie aplikacji dla Windows 8 (WinRT)
Page 52: Programowanie aplikacji dla Windows 8 (WinRT)
Page 53: Programowanie aplikacji dla Windows 8 (WinRT)

Two-way binding

Dependency Properties INotifyPropertyChanged

Zdarzenie PropertyChanged Czasem łączenie z CallerMemberName Model danych nie powinien być z UI – często konieczna implementacja

Page 54: Programowanie aplikacji dla Windows 8 (WinRT)

Binding - inne

Konwertery Statyczne zasoby

Lokalne Globalne

Page 55: Programowanie aplikacji dla Windows 8 (WinRT)

Style

Globalne / lokalne Resource Dictionaries

<ResourceDictionary Source="Common/StandardStyles.xaml"/>

var firstOne = (Storyboard)MainGrid.Resources["FirstOneAnimation"];

foreach (var storyboard in MainGrid.Resources.Values.OfType<Storyboard>()){

storyboard.Begin();}

Page 56: Programowanie aplikacji dla Windows 8 (WinRT)

Dzień 2Programowanie Windows 8

Page 57: Programowanie aplikacji dla Windows 8 (WinRT)

Przypomnienie

Windows 8, Windows Store, sideloading, itp. Trochę o HTML 5, TypeScript i Windows 8 + Blend XAML - wprowadzenie

Dependency properties, attached property User control Binding, datacontext, konwertery Style, zasoby Blend + edycja template’u

Page 58: Programowanie aplikacji dla Windows 8 (WinRT)

Demo

Page 59: Programowanie aplikacji dla Windows 8 (WinRT)

Animacje

StoryBoard Wykorzystywany w wielu miejscach – np. stany i szablony kontrolek 2 typy – klasyczny i keyframe (object.property).(object.property)

<Storyboard x:Name="FirstOneAnimation"Storyboard.TargetName="FirstOne">

<DoubleAnimation Duration="0:0:5"Storyboard.TargetProperty="(Rectangle.RenderTransform).(ScaleTransform.X)"From="-300" To="300"/>

</Storyboard>

Page 60: Programowanie aplikacji dla Windows 8 (WinRT)

Timeline (klasa bazowa)

Page 61: Programowanie aplikacji dla Windows 8 (WinRT)

Storyboard – c.d.

ColorAnimation DoubleAnimation PointAnimation ObjectAnimationUsingKeyFrames

Page 62: Programowanie aplikacji dla Windows 8 (WinRT)

Layout Główny element – Frame Wewnątrz Frame – Page Komponowanie ekranu z różnych layoutów

Canvas Grid StackPanel VirtualizingStackPanel WrapGrid VariableSizedWrapGrid ContentControl ItemsControl ScrollViewer ViewBox

Page 63: Programowanie aplikacji dla Windows 8 (WinRT)

Podstawowe kontenery na dane

GridView ListView ListBox FlipView

Źródło danych - CollectionViewSource

Page 64: Programowanie aplikacji dla Windows 8 (WinRT)

AppBar

<Page.BottomAppBar><AppBar x:Name="AppBar" Margin="10,0,10,0">

<local:ApplicationCommand x:Name=”AppBarCommands”/>

</AppBar></Page.BottomAppBar>

Page 65: Programowanie aplikacji dla Windows 8 (WinRT)

Demo

Page 66: Programowanie aplikacji dla Windows 8 (WinRT)

Windows 8 i XAML

Page 67: Programowanie aplikacji dla Windows 8 (WinRT)

Wywoływanie kodu natywnego z C#[DllImport("avicap32.dll", EntryPoint="capCreateCaptureWindow")]static extern int capCreateCaptureWindow( string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);

[DllImport("avicap32.dll")] static extern bool capGetDriverDescription( int wDriverIndex, [MarshalAs(UnmanagedType.LPTStr)] ref string lpszName, int cbName, [MarshalAs(UnmanagedType.LPTStr)] ref string lpszVer, int cbVer);

// więcej i więcej w podobny sposób...

Page 68: Programowanie aplikacji dla Windows 8 (WinRT)

...a w Windows 8

using Windows.Media.Capture;

var ui = new CameraCaptureUI();ui.PhotoSettings.CroppedAspectRatio = new Size(4, 3);

var file = await ui.CaptureFileAsync(CameraCaptureUIMode.Photo);

if (file != null) { var bitmap = new BitmapImage() ;

bitmap.SetSource(await file.OpenAsync(FileAccessMode.Read)); Photo.Source = bitmap;

}

Page 69: Programowanie aplikacji dla Windows 8 (WinRT)

Integralna część komponentu WinRT – metadane (tzw. WinMD) Standard zgodny z ECMA-355 (.NET) CLR wiąże definicje z implementacją automatycznie

Visual Studio 2012 „patrzy” na WinRT przez pryzmat WinMD Natywny dla danego języka sposób wywoływania komponentu

C:\Windows\System32\WinMetadata

Projekcje językowe

Page 70: Programowanie aplikacji dla Windows 8 (WinRT)

Projekcje językowe

WindowsRuntime

Object(or Component)

Writtenin C++, C#, VB

Windows Metadata

C++ App

Projection

CLR

C#/VB App

ProjectionHTML AppChakra

Projection

Page 71: Programowanie aplikacji dla Windows 8 (WinRT)

ImageEncodingProperties^ imageProperties = ref new ImageEncodingProperties();imageProperties->Subtype = „JPEG”;imageProperties->Width = 320;imageProperties->Height = 240;

auto opCapturePhoto = m_mediaCaptureMgr->CapturePhotoToStorageFileAsync(imageProperties,this->m_photoStorageFile);

ImageEncodingProperties imageProperties = new ImageEncodingProperties();imageProperties.Subtype = „JPEG”;imageProperties.Width = 320;imageProperties.Height = 240;await mediaCaptureMgr.CapturePhotoToStorageFileAsync(imageProperties, photoStorageFile);

var photoProperties = new Windows.Media.MediaProperties.ImageEncodingProperties();photoProperties.subtype = „JPEG”;photoProperties.width = 320;photoProperties.height = 240;mediaCaptureMgr.capturePhotoToStorageFileAsync(photoProperties, photoStorage).then(…

C++

C#

JavaScript

Page 72: Programowanie aplikacji dla Windows 8 (WinRT)

Bezpośrednie mapowania

Primitives(strings, numbers,

etc) Interfaces Enums Structs Delegates Classes

Constructors Static Members Methods Properties Events

Page 73: Programowanie aplikacji dla Windows 8 (WinRT)

.NET i Windows Runtime

IReadOnlyDictionary<K,V>IMapView<K,V>

IEnumerable<T>IIterable<T>

IList<T>IVector<T>

IReadOnlyList<T>IVectorView<T>

IDictionary<K,V>IMap<K,V>

Page 74: Programowanie aplikacji dla Windows 8 (WinRT)

Konwersje typów

FileOpenPicker picker = new FileOpenPicker();picker.FileTypeFilter.Add("*");

StorageFile file = await picker.PickSingleFileAsync();

Windows.Storage.Streams.IInputStream inputStream = await file.OpenForReadAsync();

System.IO.Stream stream = inputStream.AsStream();System.IO.StreamReader reader = new StreamReader(stream);

string contents = reader.ReadToEnd();

Page 75: Programowanie aplikacji dla Windows 8 (WinRT)

String – nie może być null Przy próbie przekazania do komponentu WinRT – exception Nigdy nie otrzymamy null od komponentu WinRT

Tablice, kolekcje - read-only lub write-only void PassArray([In] int[] array); void FillArray([Out] int[] array, out int size);

Interfejs, nie implementacja List<string> vs IList<string>

Virtual - nie Uri – tylko absolute DateTime – tracimy informację o strefie czasowej

Kiedy należy uważać

Page 76: Programowanie aplikacji dla Windows 8 (WinRT)

Możesz tworzyć własne komponenty WinRT Logika wywoływana przez C# / JS / C++

2 typy komponentów Natywne – C++ .NET – C# / VB

Własne komponenty WinRT

Page 77: Programowanie aplikacji dla Windows 8 (WinRT)

Sygnatury API muszą wykorzystywać typy WinRT Tylko dla publicznych typów i właściwości Część typów ma sposoby na konwersję – np. extension methods

Struktury mogą mieć tylko publiczne pola Wszystkie typy muszą być oznaczone jako sealed

(oprócz kontrolek XAML) Tylko systemowe typy ogólne

Własne komponenty WinRT – zasady

Page 78: Programowanie aplikacji dla Windows 8 (WinRT)

Pod spodem klasyczny .NET (aplikacje pisane w C#) Specjalny profil dla aplikacji Windows Store Sztuczki z Reflection – nie przejdą przez certyfikację Windows Store Class Libraries lub Portable Class Libraries

Dozwolone niektóre API COM i Win32 Lista dozwolonych API

Dozwolone API

Page 79: Programowanie aplikacji dla Windows 8 (WinRT)

Dystrybucja komponentów WinRT

Nie mogą być dystrybuowane w sklepie samodzielnie Nie mogą być współdzielone pomiędzy aplikacjami Mogą być sprzedawane developerom

Page 80: Programowanie aplikacji dla Windows 8 (WinRT)

DemoWłasny komponent WinRT, integracja z HTML

Page 81: Programowanie aplikacji dla Windows 8 (WinRT)

Interfejs ma być „Fast & Fluid” Wszystkie API trwające >50 ms muszą być asynchroniczne

API bazują na Task<T>

Asynchroniczność

var data = DownloadData(...);ProcessData(data);

var future = DownloadDataAsync(...); future.ContinueWith(data => ProcessData(data));

DownloadDataAsync

ProcessData

STOP

ProcessDataDownloadData

Page 82: Programowanie aplikacji dla Windows 8 (WinRT)

private void DownloadPage(){    WebClient client = new WebClient();    client.DownloadStringCompleted += (o, e) =>        {            if (e.Error == null)            {                WebClient client2 = new WebClient();                client2.DownloadStringCompleted += (o, e) =>                    {                                                if (e.Error == null)                        {                            ...                        }                    };                client2.DownloadStringAsync(new Uri("http://www.microsoft.com"));            }        };    client.DownloadStringAsync(new Uri("http://www.bing.com"));}

Asynchroniczność - trudności

Page 83: Programowanie aplikacji dla Windows 8 (WinRT)

private async void DownloadPage() { HttpClient client = new HttpClient(); string bing = await client.GetStringAsync("http://www.bing.com"); string ms = await client.GetStringAsync("http://www.microsoft.com");

naszTextbox.Text = ms; }

Asynchroniczność w Windows 8 – C#

Page 84: Programowanie aplikacji dla Windows 8 (WinRT)

Asynchroniczność w C#

Task<T> async, await

Automatyczna transformacja na callbackową maszynę stanów Asynchroniczne metody

Oznaczone nowym słowem kluczowym “async” Muszą zwracać void lub Task<T> Wykorzystują operator “await” do przekazania kontroli Wskrzeszane, kiedy operacje zostają zakończone Łączone z klasycznymi konstrukcjami językowymi Wygląda jak stary, prosty kod synchroniczny!

Inne Windows Phone 7 – async CTP Silverlight 5 i .NET 4 - Async Targeting Pack

Page 85: Programowanie aplikacji dla Windows 8 (WinRT)

Automatyczna transformacja na callbackową maszynę stanów

Asynchroniczne metody Oznaczone nowym słowem kluczowym “async” Muszą zwracać void lub Task<T> Wykorzystują operator “await” do przekazania kontroli Wskrzeszane, kiedy operacje zostają zakończone Łączone z klasycznymi konstrukcjami językowymi

Wygląda jak stary, prosty kod synchroniczny!

Async, await

Page 86: Programowanie aplikacji dla Windows 8 (WinRT)

Task t, t1, t2 = ...

// Task chainingTask t3 = t.ContinueWith( () => { ... } );

Task[] taskCollection = new Task[] { client.GetStringAsync("http://www.bing.com"), client.GetStringAsync("http://www.bing.com"),};

// Task, który wykona się po zakończeniu tasków t1 i t2Task t4 = t.WhenAll(taskCollection);

// Oczekiwanie na zakończenie taskówTask.WaitAll(taskCollection);Task.WaitAny(taskCollection);

Taski - łączenie

Page 87: Programowanie aplikacji dla Windows 8 (WinRT)

// Wywołanie kodu w innym wątku z ThreadPool – jako Task

int result = await Task.Run(async () => { // Tu długotrwałe przetwarzanie danych w innym wątku... // ...

    await Task.Delay(1000);     return 42; });

Dowolny kod jako Task

Page 88: Programowanie aplikacji dla Windows 8 (WinRT)

Przykłady

private async void Button_Click_2(object sender, RoutedEventArgs e)

{

Button b = (Button) sender;

await Task.Run(() => {

b.Content += ".";

});

}

private async void Button_Click_2(object sender, RoutedEventArgs e)

{

Button b = (Button) sender;

await b.Dispatcher.RunAsync(

Windows.UI.Core.CoreDispatcherPriority.Normal,

() => {

b.Content += ".";

});

}

Page 89: Programowanie aplikacji dla Windows 8 (WinRT)

Przykłady

Windows.Media.Capture.CameraCaptureUI ccui;

private async void Button_Click_1(object sender, RoutedEventArgs e)

{

ccui = new Windows.Media.Capture.CameraCaptureUI();

await Task.Run(() => {

ccui.PhotoSettings.AllowCropping = true;

});

}

Windows.Media.Capture.CameraCaptureUI ccui;

private async void Button_Click_3(object sender, RoutedEventArgs e)

{

ccui = new Windows.Media.Capture.CameraCaptureUI();

await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,

() => {

ccui.PhotoSettings.AllowCropping = true;

});

}

Page 90: Programowanie aplikacji dla Windows 8 (WinRT)

public Task<string> GetStringAsync(Uri uri) { var tcs = new TaskCompletionSource<string>(); // .....długotrwała operacja asynchroniczna

var wc = new WebClient(); Wc.DownloadCompleted += (s, e) => { if (e.Error != null) { tcs.TrySetException(e.Error); } else if (e.Cancelled) { tcs.TrySetCanceled(); } else { tcs.TrySetResult(e.Result); } }; return tcs.Task; }

Opakowanie kodu w Task<T>

Page 91: Programowanie aplikacji dla Windows 8 (WinRT)

// tzw. Promises

WinJS.xhr({ url:"http://www.example.org/somedata.json"}).then(function (response) { updateDisplay( JSON.parse(response.responseText));}, function (ex) { reportXhrError(ex);});

Asynchroniczność w Windows 8 - Javascript

Page 92: Programowanie aplikacji dla Windows 8 (WinRT)

Asynchroniczność

Każde wywołanie API, które zajmuje powyżej 50 ms Dotychczas uciążliwe pisanie wielu callbacków

JavaScript .then .done (tzw. Promise)

C# async await CancellationToken, TPL, Task<T>, …

C++ Różne biblioteki Klasa task, metoda .then

Page 93: Programowanie aplikacji dla Windows 8 (WinRT)

Promises - asynchroniczność

Obietnica dostarczenia wartości w przyszłości Wiązane przez metodę then()

then(completion, error, progress) then() zwraca kolejny obiekt promise Implementacja w base.js: WinJS.Promise

Page 94: Programowanie aplikacji dla Windows 8 (WinRT)

Promise

WinJS.xhr({ url:"http://www.example.org/somedata.json"}).then(function (response) { updateDisplay( JSON.parse(response.responseText));}, function (ex) { reportXhrError(ex);});

Page 95: Programowanie aplikacji dla Windows 8 (WinRT)

DemoAsync w Windows 8

Page 96: Programowanie aplikacji dla Windows 8 (WinRT)

Cykl życia aplikacji

Uruchomionaaplikacja Zawieszona

zawieszanie Zamknięta

aplikacjaBrak pamięci

Kod jest wywoływany Kod wstrzymany Aplikacja wyłączona

wznawianie

App gets 5s to handle suspend

App is not notified before termination

Apps are notified when they have been resumed

Użytkownik uruchamia

Splash screen

Page 97: Programowanie aplikacji dla Windows 8 (WinRT)

Cykl życia aplikacji – c.d.

Wstrzymanie aplikacji Fizycznie pozostaje w pamięci

Zamknięcie Zamknięta przez użytkownika System potrzebuje pamięci Przełączenie użytkownika Wyłączenie komputera Wyjątek Brak notyfikacji!

Page 98: Programowanie aplikacji dla Windows 8 (WinRT)

Zapis stanu - najlepsze praktyki

Scenariusz Powinniśmy….

Użytkownik pracuje z aplikacją

Inkrementalny zapis stanu

Aplikacja wstrzymywanaZapisanie informacji gdzie jest użytkownik (np. aktywna strona)

Aktywacja wyłączonej aplikacji

Odczyt sesji tak, aby aplikacja sprawiała wrażenie nie zamkniętej

Aktywacja zawieszonej aplikacji

Nic nie rób

Page 99: Programowanie aplikacji dla Windows 8 (WinRT)

Aktywacja

// Override App’s OnLaunched

protected async override void OnLaunched(LaunchActivatedEventArgs args){ if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) { // Do an asynchronous restore await SuspensionManager.RestoreAsync(); }

if (args.Kind == ActivationKind.Launch) { if ( !string.IsNullOrEmpty ( args.Arguments ) { // handle arguments } } else if ( args.Kind == ActivationKind.ShareTarget ) { } // … }

Page 100: Programowanie aplikacji dla Windows 8 (WinRT)

Wznawianie

App.Current.Suspending += OnSuspending;

void OnSuspending(object sender, Windows.ApplicationModel.SuspendingEventArgs e){} App.Current.Resuming += OnResuming;

void OnResuming(object sender, object e)}// Z reguły nie potrzebne

Page 101: Programowanie aplikacji dla Windows 8 (WinRT)

Splash screen

Domyślnie – grafika w manifest 15 sekund na wyświetlenie pierwszej strony Extended Splash Screen

Przekierownie na inną stronę od razu (progress bar) Doczytywanie na drugiej stronie

Page 102: Programowanie aplikacji dla Windows 8 (WinRT)

DemoTask switchingSplash screen

Page 103: Programowanie aplikacji dla Windows 8 (WinRT)

Podstawowy szablon projektu

SuspensionManager Zarządzanie stanem aplikacji (lokalny dla stron, globalny)

Serializuje wynik pracy do: %userprofile%\appdata\local\packages\...\LocalState\_sessionState.xml

LayoutAwarePage Klasa bazowa dla wszystkich stron

Przełączanie Visual State (dla snapped, filled, itp.)

Nawigacja

Zarządzanie stanem

DefaultViewModel

Konwertery, style (przycisk wstecz, itp.), klasa bazowa (INotifyPropertyChanged)

Page 104: Programowanie aplikacji dla Windows 8 (WinRT)

SuspensionManager RegisterFrame - rejestruje do automatycznego zapisywania / przywracania historii nawigacji Dependency property dla klasy Frame

FrameSessionStateKeyProperty FrameSessionStateProperty

Stan globalny - SuspensionManager.SessionState[„MojKlucz”] Uwaga na zarejestrowne „Frames”!

Sesja – struktura MojFrame1 (z reguły tylko jeden)

[„Navigation”, string] [„page-1”, Dictionary<string, object>]

[„GodzinaUruchomienia”, ...] ...

[„page-2”, Dictionary<string, object>] ...

[MojFrame2, ...] [MojKlucz, ...]

Page 105: Programowanie aplikacji dla Windows 8 (WinRT)

LayoutAwarePage – stan lokalny stron Automatyczne zapisywanie / wczytywanie stanu lokalnego

LoadState – przekazany stan oraz parametr nawigacyjny SaveState – przekazany kontener do uzupełnienia

Usuwanie stanu, kiedy nawigujemy na nową stronę

Page 106: Programowanie aplikacji dla Windows 8 (WinRT)

Stan lokalnyprotected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState){

var group = SampleDataSource.GetGroup((String)navigationParameter);this.DefaultViewModel["Group"] = group;this.DefaultViewModel["Items"] = group.Items;

if (pageState != null && pageState.ContainsKey("Date")){

pageTitle.Text = (String)pageState["Date"];}

}

protected override void SaveState(Dictionary<string, object> pageState){

pageState["Date"] = pageTitle.Text;base.SaveState(pageState);

}

Page 107: Programowanie aplikacji dla Windows 8 (WinRT)

DemoZarządzanie stanem

Page 108: Programowanie aplikacji dla Windows 8 (WinRT)

LayoutAwarePage - nawigacja

GoBack, GoHome, GoForward Mysz - wstecz / dalej Klawiatura – wstecz / dalej

Domyślnie – zawsze nowa instancja po back (inaczej niż w WP) Możliwość zmiany NavigationCacheMode – zachowanie jak w WP

Page 109: Programowanie aplikacji dla Windows 8 (WinRT)

Zarządzanie stanem wizualnym

WindowSizeChanged Zmiana stanu (filled / snapped, itp.) Zmiana orientacji ekranu

Visual States FullScreenLandscape Filled FullScreenPortrait Snapped

Page 110: Programowanie aplikacji dla Windows 8 (WinRT)

DemoLayoutAwarePage – c.d.Binding

Page 111: Programowanie aplikacji dla Windows 8 (WinRT)

Środowisko uruchomieniowe i uprawnienia Paczka aplikacyjna

App Manifest Blockmap – hashe wszystkich plików Podpis – sprawdza spójność

Model uprawnień App Container i System Broker Capabilities Permissions

Izolacja procesów

Page 112: Programowanie aplikacji dla Windows 8 (WinRT)

DemoCapabilities

Page 113: Programowanie aplikacji dla Windows 8 (WinRT)

Klient bliski Silverlightowi czy Windows Phone Obecnie brak WCF RIA Services

Obsługiwane typy komunikacji HttpClient (JSON, XML, ...) Usługi ASMX WCF ODATA Sockets

Bindingi WCF BasicHttpBinding NetTcpBinding NetHttpBinding CustomBinding

Windows 8 i usługi

Page 114: Programowanie aplikacji dla Windows 8 (WinRT)

Komunikacja

HttpClient (brak WebClient) DownloadOperation / BackgroundDownloader – kiedy potrzebny

progress XmlDocument.LoadFromUriAsync – kiedy wczytujemy XML WCF – specjalne proxy dla async/await

public async Task<string> MakeWebRequest(){ HttpClient http = new System.Net.Http.HttpClient(); HttpResponseMessage response = await http.GetAsync("http://www.example.com"); return await response.Content.ReadAsStringAsync();}

Page 115: Programowanie aplikacji dla Windows 8 (WinRT)

// Parse the JSON datavar array = JsonArray.Parse(result);

foreach (var item in array){

var obj = item.GetObject(); RecipeDataItem recipe = new RecipeDataItem();

foreach (var key in obj.Keys) { IJsonValue val; if (!obj.TryGetValue(key, out val)) continue;

switch (key) { case "key": recipe.UniqueId = val.GetNumber().ToString(); break; case "title": recipe.Title = val.GetString(); break;

case "ingredients": var ingredients = val.GetArray(); var list = (from i in ingredients select i.GetString()).ToList(); recipe.Ingredients = new ObservableCollection<string>(list); break;

}}

Page 116: Programowanie aplikacji dla Windows 8 (WinRT)

Json - serializacja [DataContract] internal class Person { [DataMember] internal string name;

[DataMember] internal int age; }

// Klasycznie (DataContractJsonSerializer)MemoryStream stream1 = new MemoryStream();DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));stream1.Position = 0;Person p2 = (Person)ser.ReadObject(stream1);

// Newtonsoft Json (nuGet) – szybciej i bardziej elastycznieMyObject obj = JsonConvert.DeserializeObject<MyObject>(jsonEncodedString);

Page 117: Programowanie aplikacji dla Windows 8 (WinRT)

Live Connect Single sign on (SSO) Możliwe wykorzystanie kontekstu użytkownika

WebAuthenticationBroker Integracja z innymi usługami OAUTH 2.0 Bezpieczny, gotowy mechanizm logowania Facebook, Google, Flickr, Twitter, Live

Uwierzytelnienie – zewnętrzne usługi

await WebAuthenticationBroker.AuthenticateAsync()

Page 118: Programowanie aplikacji dla Windows 8 (WinRT)

DemoWCF, ASP.NET MVC Web API

Page 119: Programowanie aplikacji dla Windows 8 (WinRT)

Baza relacyjnaJetAPI C++, JetCreateDatabase2 itp. (to samo co AD, Exchange itp.)

IndexedDBHTML5, ale..

IDBDatabase

SQLite (wersja Release by przeszła WACK!)

Page 120: Programowanie aplikacji dla Windows 8 (WinRT)

SQLiteExtension + biblioteka kliencka z Nuget

Kompilować w Release – inaczej nie przejdzie WACK

Page 121: Programowanie aplikacji dla Windows 8 (WinRT)

DemoBaza danych

Page 122: Programowanie aplikacji dla Windows 8 (WinRT)

Semantic zoom

Zmiana „kontekstu” listy na bardziej ogólny Ctrl + rolka, ctrl +/-, przycisk

Kontrolka SemanticZoom ZoomedInView ZoomedOutView

ISemantizZoomInformation ListView GridView

Źródło dla zoomin i zoomout musi być powiązane CollectionViewSource - this.groupedItemsViewSource.View.CollectionGroups;

Page 123: Programowanie aplikacji dla Windows 8 (WinRT)

<CollectionViewSource x:Name="groupedItemsViewSource" Source="{Binding Groups}" IsSourceGrouped="true" ItemsPath="TopItems"/>

// ItemsPath – dla grup LINQ nie jest potrzebne

List<Activity> Activities = new List<Activity>(); Activities.Add(new Activity() { Name = "Activity 1", Complete = true, DueDate = startDate.AddDays(4), Project = "Project 1" }); Activities.Add(new Activity() { Name = "Activity 2", Complete = true, DueDate = startDate.AddDays(5), Project = "Project 1" }); Activities.Add(new Activity() { Name = "Activity 3", Complete = false, DueDate = startDate.AddDays(7), Project = "Project 1" }); Activities.Add(new Activity() { Name = "Activity 4", Complete = false, DueDate = startDate.AddDays(9), Project = "Project 1" }); Activities.Add(new Activity() { Name = "Activity 5", Complete = false, DueDate = startDate.AddDays(14), Project = "Project 1" });

var result = from act in Activities group act by act.Project into grp orderby grp.Key select grp;

// Dla zoom incvsActivities.Source = result;

// Dla zoomoutthis.groupGridView.ItemsSource = this.cvsActivities.View.CollectionGroups;

Page 124: Programowanie aplikacji dla Windows 8 (WinRT)

DemoSemantic Zoom

Page 125: Programowanie aplikacji dla Windows 8 (WinRT)

Kontrakty, integracja z systemem

Page 126: Programowanie aplikacji dla Windows 8 (WinRT)

Proces share’owaniaAplikacja docelowaShare Broker

Użytkownik wybiera “Share”, zdarzenie w app

Aktywowana do share’owania

Rejestracja w DataTransfer Manager

Aplikacja źródłowa

Filtrowanie listy target i quick links

Użytkownik wybiera aplikację lub quick link

Przetwarzanie zawartości DataPackage

Zgłasza koniec

Kończy Async call i kończy pracę

Otrzymuje event i wypełnia DataPackage

DataPackage żyje w aplikacji źródłowej

Aktywacja docelowej aplikacji (kind: shareTarget)

Page 127: Programowanie aplikacji dla Windows 8 (WinRT)

Share

Share target Konieczne deklaracje w manifeście typu obsługiwanych danych

Share source – zdarzenie DataTransferManager OnDataRequested (args.Data – paczka z wymienianymi danymi) Właściwości (description, title, itp.) – Title wymagany DataTransferManager.ShowShareUI(); - programowe wywołane

Lista aplikacji docelowych filtrowana na podstawie tego co umieścimy w paczce (np. SetText, SetHTML, ...)

Możliwe umieszczenie danych w kilku „szufladach” jednocześnie (np. tekst i HTML)

np. Poczta szuka w kolejności Html -> Link -> Tekst

Page 128: Programowanie aplikacji dla Windows 8 (WinRT)

Share source - przykład

DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;

void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args) { var request = args.Request; var item = (ModelItem)this.flipView.SelectedItem; request.Data.Properties.Title = item.Title; request.Data.Properties.Description = „Something to share";

// Share text var textToShare = „Text to share";

request.Data.SetText(textToShare); request.Data.SetHtmlFormat(textToShare);

}

Page 129: Programowanie aplikacji dla Windows 8 (WinRT)

Data Package

Zwykły tekst (SetText) Sformatowany tekst (SetRtf) URI (SetUri) HTML (SetHtmlFormat) Pliki (SetStorageItems) Zdjęcia (SetBitmap)

Zalecane dodatkowo SetStorageItems Własne formaty danych (SetData)

Page 130: Programowanie aplikacji dla Windows 8 (WinRT)

Własne formaty

Zalecane sprawdzenie czy typ nie jest już publicznie udokumentowany http://schema.org/ (np. http://schema.org/Book) Obsługa wyjątków podczas wczytywania

Obsługiwane typy Skalary (integer, string, DateTime, itp.) poprzez IPropertyValue. IRandomAccessStream, IRandomAccessStreamReference - np. własna klasa i

DataContractSerializer IUri IStorageItem Kolekcje powyższych

Page 131: Programowanie aplikacji dla Windows 8 (WinRT)

Data Provider

Zalecane, kiedy długotrwałe przetwarzanie danych Np. pomniejszenie zdjęcia przed udostepnieniem

Deferral providerRequest.GetDeferral();

Standardowe typy (StandardDataFormats) lub własne

requestData.SetDataProvider(StandardDataFormats.Bitmap, providerRequest => this.OnDeferredImageRequestedHandler(providerRequest, this.selectedImage));

Page 132: Programowanie aplikacji dla Windows 8 (WinRT)

DemoShare source

Page 133: Programowanie aplikacji dla Windows 8 (WinRT)

Share target Konieczna deklaracja w manifeście

Formaty danych Formaty plików

OnShareTargetActivated(ShareTargetActivatedEventArgs args) args.ShareOperation Zalecane pobranie ShareOperation i przetwarzanie asynchroniczne

ShareOperation Data – obiekt DataPackageView (praktycznie r/o DataPackage) QuickLinkId

await Task.Factory.StartNew(async () =>

{

// Przetwarzamy Data Package

}

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>

{

// Wracamy do wątku UI

}

Page 134: Programowanie aplikacji dla Windows 8 (WinRT)

Długie przetwarzanie shareOperation.ReportStarted();

Od tego momentu brak interakcji z aplikacją share’ującą Użytkownik może zamknąć okno share i wrócić do aplikacji

shareOperation.ReportDataRetreived(); (opcja) Po pobraniu danych z DataPackage Zgłasza mozliwość uśpienia / zamknięcia aplikacji źródłowej - optymalizacja Może być wywołany przed ReportStarted() – np. Task po aktywacji Share, ale przed kliknięciem „wyślij” w celu

przyspieszenia procesu shareOperation.ReportSubmittedBackgroundTask(); (opcja)

Sugerowane zgłoszenie, kiedy korzystamy z BackgroundTransfer – optymalizacja shareOperation.ReportCompleted([quicklink]);

Zgłoszenie zakończenia Zapisanie quicklinka i (samodzielnie) identyfikatora np. w bazie

shareOperation.ReportError(txt); Przerwanie operacji, toast + komunikat o błędzie

Page 135: Programowanie aplikacji dla Windows 8 (WinRT)

QuickLink quickLinkInfo = new QuickLink{

Id = QuickLinkId.Text,Title = QuickLinkTitle.Text,

SupportedFileTypes = { "*" },SupportedDataFormats =

{StandardDataFormats.Text,StandardDataFormats.Uri,StandardDataFormats.Bitmap,StandardDataFormats.StorageItems,StandardDataFormats.Html,dataFormatName

}};

Quick Link

Formaty i typy plików niezależne od manifestu Czyszczone / wyłączane z panelu sterowania (share -> clear list)

Page 136: Programowanie aplikacji dla Windows 8 (WinRT)

DemoShare target

Page 137: Programowanie aplikacji dla Windows 8 (WinRT)

Search

Wpis w deklaracjach manifestu OnSearchActivated

Kiedy search wywołany gdy aplikacja była zamknięta, OnLaunched NIE WYWOŁYWANY

Konieczne ręczne zainicjalizowanie aplikacji (jak w OnLaunched) ShowOnKeyboardInput – automatyczne otwieranie charms bar

Page 138: Programowanie aplikacji dla Windows 8 (WinRT)

Podpowiedzi

Wcześniej aktywowanie aplikacji (wybranie jej z listy charms) SearchPane.GetForCurrentView().SuggestionsRequested

args.QueryText args.Request.SearchSuggestionCollection.AppendQuerySuggestion(...);

SetLocalContentSuggestionSettings - pliki Separatory – AppendSearchSeparator Rezultaty (ze zdjęciem i opisem) - AppendResultSuggestion

Łącznie 5 elementów (sugestie, rezultaty, separatory)

Page 139: Programowanie aplikacji dla Windows 8 (WinRT)

DemoSearch contract

Page 140: Programowanie aplikacji dla Windows 8 (WinRT)

Ustawienia

Domyślnie tylko Permissions – na podstawie capabilities SettingsPane.GetForCurrentView().CommandsRequested

Komendy obsługiwane przez daną stronę Flyout – najprościej z Callisto

Najlepiej w App.xaml.cs W przeciwnym wypadku trzymanie referencji do strony (GC)

Flyout Zwykła kontrolka Popup odpowiednio wypozycjonowana Transitions 346 lub 646 pikseli

Page 141: Programowanie aplikacji dla Windows 8 (WinRT)

Ustawienia - kodSettingsPane.GetForCurrentView().CommandsRequested += onCommandsRequested;

void onCommandsRequested(SettingsPane settingsPane, SettingsPaneCommandsRequestedEventArgs eventArgs){

UICommandInvokedHandler handler = new UICommandInvokedHandler(onSettingsCommand);

SettingsCommand generalCommand = new SettingsCommand("generalSettings", "General", handler);eventArgs.Request.ApplicationCommands.Add(generalCommand);

}

// To samo z flyout (callisto) void OnCommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args) { // Add an About command var about = new SettingsCommand("about", "About", (handler) => { var settings = new SettingsFlyout(); settings.Content = new AboutUserControl(); settings.HeaderBrush = new SolidColorBrush(_background); settings.Background = new SolidColorBrush(_background); settings.HeaderText = "About"; settings.IsOpen = true; });

args.Request.ApplicationCommands.Add(about); }

Page 142: Programowanie aplikacji dla Windows 8 (WinRT)

DemoUstawienia

Page 143: Programowanie aplikacji dla Windows 8 (WinRT)

Zapisywanie danych

Katalog instalacyjny App data

Ustawienia lokalne – ApplicationData.Current.LocalSettings Kontenery - proste grupowanie ustawień Composite ms-appdata://local //roaming //temp

Pliki, sesja – ApplicationData.Current.LocalFolder User data

Dokumenty, zdjęcia, muzyka, filmy Roaming

Page 144: Programowanie aplikacji dla Windows 8 (WinRT)

Roaming Settings ApplicationData.Current.RoamingSettings Dostępne nawet, kiedy brak sieci / nie połączone konto LiveID Max 100 KB

ApplicationData.Current.RoamingStorageQuota;

Synchronizacja, kiedy system zadecyduje Typ połączenia z siecią, obciążenie, itp. Brak możliwości wymuszenia synchronizacji

Composite settings dla „atomowych” zmian (konflikty) ApplicationDataCompositeValue

Ustawienie HighPriority dla bardzo istotnych Może być composite

ApplicationData.Current.SetVersion – aby uniknąć problemów z wersjonowaniem DataChangedHandler

Page 145: Programowanie aplikacji dla Windows 8 (WinRT)

DemoUstawienia

Page 146: Programowanie aplikacji dla Windows 8 (WinRT)

Devices

Drukowanie NFC DLNA

Tylko Windows Certified (podzbiór „Play To”) Obecnie m.in. najnowsze Samsung Smart TV, amplitunery Onkyo, Sony, PlayTo

API, Windows Media Player, ...

Page 147: Programowanie aplikacji dla Windows 8 (WinRT)
Page 148: Programowanie aplikacji dla Windows 8 (WinRT)

DemoDrukowanie

Page 149: Programowanie aplikacji dla Windows 8 (WinRT)

Play To

Strumieniowanie z naszej aplikacji MediaElement – muzyka, film Image (może zdalny PowerPoint?)

Dostęp do danych z Media Serwerów Aplikacja jako odbiorca Play To

Teoretycznie do wykorzystania dla dowolnego strumienia

Page 150: Programowanie aplikacji dla Windows 8 (WinRT)

Implementacja Play To

<MediaElement x:Name="videoplayer" Source = "http://www.contoso.com/clip.mp4" AutoPlay="true" />

// Krok 1: PlayToManager dla widoku.

PlayToManager ptm = Windows.Media.PlayTo.PlayToManager.GetForCurrentView();

// Krok 2: Zdarzenie SourceRequested (użytkownik wskazał urządzenie).

ptm.SourceRequested += (PlayToManager sender, PlayToSourceRequestedEventArgs e) => {

request = e.SourceRequest;

// Krok 3: określenie mediów do strumieniowania

PlayToSourceDeferral deferral = request.GetDeferral();

request.SetSource(videoplayer.PlayToSource);

deferral.Complete();

}

// Media strumieniowane do urządzenia

Page 151: Programowanie aplikacji dla Windows 8 (WinRT)

DemoPlay to

Page 152: Programowanie aplikacji dla Windows 8 (WinRT)

Shareowanie z osobami w pobliżu

// Rejestrujemy w klasyczny sposób kontrakt do share’owaniafunction setupShare() { var dtm = Windows.appModel.DataTransfer.DataTransferManager.getForCurrentView(); dtm.addEventListener("datarequested", function (e) { onDataRequested(e); });}

// Obsługujemy tak jak lokalne żądanie do share’owania function onDataRequested(e) {

var dp = new Windows.appModel.DataTransfer.DataPackage(); dp.properties.title = "Our Test Text"; // required dp.properties.description = "Test Description"; // required dp.setUri(new Windows.Foundation.Uri("http://www.oddfellows.com")); e.request.data = dp;}

Page 153: Programowanie aplikacji dla Windows 8 (WinRT)

App To App pickers

Page 154: Programowanie aplikacji dla Windows 8 (WinRT)

App To App pickers

Page 155: Programowanie aplikacji dla Windows 8 (WinRT)

DemoContacts picker

Page 156: Programowanie aplikacji dla Windows 8 (WinRT)

Własne protokoły

mojprotokol://jakies/parametry Z przeglądarki (zarówno Metro jak i Desktop) Przekazywane parametry do OnActivated Działa także jako link w aplikacji Jeśli kilka aplikacji zarejestrowanych – wybór za pierwszym razem

Page 157: Programowanie aplikacji dla Windows 8 (WinRT)

DemoWłasny protokół

Page 158: Programowanie aplikacji dla Windows 8 (WinRT)

Touch

Proste gesty Tap

Nie to samo co mouse_down W przypadku myszki – dowolny czas, bez ruchu W przypadku ekranu dotykowego – max. pół sekundy

DoubleTap, Holding, ...

Pointer events PointerPressed, PointerReleased, PointerMoved Dla palca, myszki, rysika, ... Unikalne identyfikatory

Page 159: Programowanie aplikacji dla Windows 8 (WinRT)

DemoTouch

Page 160: Programowanie aplikacji dla Windows 8 (WinRT)

Praca w tle

Background Audio Kilka niezależnych typów (komunikator, media, gra,itp.) Jeden typ strumienia na raz

Background Transfer Upload / download danych w tle

Page 161: Programowanie aplikacji dla Windows 8 (WinRT)

Execution = Trigger + [Condition]

Trigger Condition

InternetAvailable, InternetNotAvailable, SessionConnected, SessionDisconnected, UserNotPresent, UserPresent

SystemEventTriggerControlChannelReset #InternetAvailableLockScreenApplicationAdded/RemovedNetworkStateChange OnlineIdConnectedStateChangeServicingCompleteSessionConnected/Disconnected #SmsReceivedTimeZoneChangeUserAway/UserPresent #

ControlChannelTrigger # (**)TimeTrigger #PushNotificationTrigger # (**)MaintenanceTrigger # wymaga lock permission

**może być in-proc (nie BackgroundTaskHost.exe)

„Condition latching”Maintenance trigger – na zasilaniu

Page 162: Programowanie aplikacji dla Windows 8 (WinRT)

Rejestracja - manifest

<Extensions> <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.SampleBackgroundTask"> <BackgroundTasks> <Task Type="systemEvent" /> <Task Type="timer" /> </BackgroundTasks> </Extension> <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ServicingComplete"> <BackgroundTasks> <Task Type="systemEvent" /> </BackgroundTasks> </Extension></Extensions>

Page 163: Programowanie aplikacji dla Windows 8 (WinRT)

Rejestracja – c.d.

string BackgroundTaskName = "SampleBackgroundTask";string BackgroundTaskEntryPoint = "BackgroundTask.SampleBackgroundTask";

void RegisterBackgroundTask(){ var taskBuilder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder(); var systemTrigger = new SystemTrigger(SystemTriggerType.InternetAvailable , false); var userPresentCondition = new SystemCondition(SystemConditionType.UserPresent);

taskBuilder.SetTrigger(systemTrigger); taskBuilder.AddCondition(userPresentCondition); taskBuilder.Name = BackgroundTaskName; taskBuilder.TaskEntryPoint = BackgroundTaskEntryPoint;

var task = taskBuilder.Register(); task.Progress += task_Progress; task.Completed += task_Completed; }

Page 164: Programowanie aplikacji dla Windows 8 (WinRT)

Aplikacje Lock Screen

Aplikacje, które mogą działać w tleZwłaszcza aplikacje komunikacyjne (poczta, komunikator, VoIP)

Okresowe uruchamianieUruchamianie kodu w odpowiedzi na zdarzenia systemowe

Page 165: Programowanie aplikacji dla Windows 8 (WinRT)

Zarządzane przez użytkownika (max 7)

Page 166: Programowanie aplikacji dla Windows 8 (WinRT)
Page 167: Programowanie aplikacji dla Windows 8 (WinRT)

Przydzielanie zasobów

CPU quota Odświeżanie

Z lock screen 2 sekundy CPU 15 minut

Bez lock screen 1 sekunda CPU 2 godziny

Tylko kiedy naprawdę „background” (przy uruchomionej aplikacji brak ograniczeń) Dotyczy tylko faktycznej pracy CPU!!!

Page 168: Programowanie aplikacji dla Windows 8 (WinRT)

Ograniczenia dla połączeń

Tylko kiedy praca na baterii

Okres odświeżania 15 min 2 godziny dziennie

Limit na dane (lock) 0.469 MB n/a 45 MB

Limit na dane (nie lock) n/a 0.625 MB 7.5 MB

Page 169: Programowanie aplikacji dla Windows 8 (WinRT)

Krytyczne zadania

Np. VOIP Triggery: Control Channel, notyfikacje Push PUSH

Brak SLA Backend musi być przystosowany

Control Channel Triggery: Control Channel lub Keep-alive (co 15 minut podtrzymanie połączenia) Przetwarzanie komunikatów, kiedy aplikacja zawieszona Software i hardware slot (dla ARM) Nieco więcej pracy Podtrzymywane połączenie

Gwarantowane zasoby dla poszczególnych zadań (takie same jak dla aplikacji)

Page 170: Programowanie aplikacji dla Windows 8 (WinRT)

Globalna pula Dodatkowe zasoby współdzielone między aplikacjami

Co 15 minut uzupełniana Wielkość zasobów zależy od wielu czynników

Nie należy na niej polegać

Lepiej wyłączyć podczas testów HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows NT\CurrentVersion\BackgroundModel\Policy\CpuEnableGlobalPool HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows NT\CurrentVersion\BackgroundModel\Policy\NetEnableGlobalPool

Może mimo wszystko nie wystarczyć… Event log BackgroundTaskInstnce.SuspendedCount

Page 171: Programowanie aplikacji dla Windows 8 (WinRT)

DemoPraca w tle

Page 172: Programowanie aplikacji dla Windows 8 (WinRT)

Live Tiles – wrażenie aktywności

Dostarczają informacji, kiedy aplikacja jest wyłączona

Wrażenie, że aplikacja działa w tle i zaproszenie do powrotu

Dwa mechanizmy do aktualizacjiLokalne APINotyfikacje PUSH

Page 173: Programowanie aplikacji dla Windows 8 (WinRT)

Tiles

2 rozmiary 150x150 px 310x150 px (opcja)

Wide – konieczne ustawienie w manifeście

var tile = new SecondaryTile( item.UniqueId, // Tile ID item.ShortTitle, // Tile short name item.Title, // Tile display name item.UniqueId, // Activation argument TileOptions.ShowNameOnLogo, // Tile options uri // Tile logo URI );

await tile.RequestCreateAsync();

Page 174: Programowanie aplikacji dla Windows 8 (WinRT)

Live Tiles

Wiele możliwości prezentacyjnych

Aktualizowane przy pomocy predefiniowanych szablonów

Tekstowe, graficzne lub mix

JPEG lub PNG, max rozmiar 150KB

Opcjonalna animacja “peek”

Lokalna lub zdalna aktualizacja

Page 175: Programowanie aplikacji dla Windows 8 (WinRT)
Page 176: Programowanie aplikacji dla Windows 8 (WinRT)

Kolejkowanie notyfikacji

Opcjonalnie rotowanie między 5 ostatnimi notyfikacjami

Domyślnie tylko ostatnia wyświetlana

Page 177: Programowanie aplikacji dla Windows 8 (WinRT)

Secondary Tiles

„Pinowanie” zawartości z wewnątrz aplikacji Proste wywołanie API Użytkownik potwierdza (systemowe UI) Personalizowana przestrzeń aplikacji Takie same możliwości jak główne kafelki

Tylko lokalne obrazy Uruchomienie przekierowuje do określonej sekcji aplikacji

Page 178: Programowanie aplikacji dla Windows 8 (WinRT)

DemoLive tiles / secondary tiles

Page 179: Programowanie aplikacji dla Windows 8 (WinRT)

Notyfikacje Toast

Podobna struktura do kafelków (oparta o szablony) Różne możliwości wizualne

Page 180: Programowanie aplikacji dla Windows 8 (WinRT)

DemoNotyfikacje Toast

Page 181: Programowanie aplikacji dla Windows 8 (WinRT)

Notyfikacje PUSH - WNS

Zdalne zmiany kafelków i notyfikacje Toast (Internet) Także, kiedy aplikacja jest wyłączona

Skalowalne, bezpłatne

Page 182: Programowanie aplikacji dla Windows 8 (WinRT)

PUSH – schemat działaniaWindows 8 Usługa w

chmurze

Windows Notification

Service

Aplikacja Metro Style

NotificationClient

Platform

2

3

1 3

1. Żądamy URI kanału PUSH

2. Rejestracja w naszej usłudze

3. Uwierzytelnienie i wysłanie notyfikacji

Page 183: Programowanie aplikacji dla Windows 8 (WinRT)

Notyfikacje – c.d.

Komunikaty: Tile, Badge, Toast, Raw Raw wymaga locked screen!

Wygasają po 30 dniach Wznowienie podczas uruchamiania aplikacji Maintenance trigger

Azure Toolkit for Windows 8

Page 184: Programowanie aplikacji dla Windows 8 (WinRT)

Azure Mobile Services

Bardzo prosty back-end w Azure Storage PUSH Uwierzytelnienie Live Connect

Bezpłatnie (obecnie preview) Do 10 instancji 165 MB Reserved – kiedy jest potrzeba

Dodatkowe opłaty 100 usług Transfer pay-as-you-go

Page 185: Programowanie aplikacji dla Windows 8 (WinRT)

DemoAzure Mobile Services

Page 186: Programowanie aplikacji dla Windows 8 (WinRT)

Windows Store

Podział zysków 70:30 lub 80:20 Reklamy – dowolnie Trial In-app purchase Rejestracja

49 lub 99 USD / rok Dreamspark, MSDN, Bizspark – bezpłatnie 1 rok!

Od strony dewelopera Pełne dane na temat licencji Recipes (przypomnienie) Symulator

Page 187: Programowanie aplikacji dla Windows 8 (WinRT)

Konwersja z Trialprivate async void ConvertTrial(){ var licenseInformation = CurrentApp.LicenseInformation;

licenseInformation.LicenseChanged += licenseInformation_LicenseChanged;if (licenseInformation.IsTrial)

await CurrentApp.RequestAppPurchaseAsync(); }

void licenseInformation_LicenseChanged(){

if (CurrentApp.LicenseInformation.IsActive) { //Enable features..

} }

Page 188: Programowanie aplikacji dla Windows 8 (WinRT)

In-app purchasevar licenseInformation = CurrentApp.LicenseInformation;var productLicense = licenseInformation.ProductLicenses["product1"];if (!productLicense.IsActive && licenseInformation.IsActive ) {

try { await CurrentAppSimulator.RequestProductPurchaseAsync("product1“, false);

// No exception: enable product1 }catch (Exception){

//product 1 was not purchased }

}

Page 189: Programowanie aplikacji dla Windows 8 (WinRT)

Symulator

CurrentAppSimulator.ReloadSimulatorAsync(file);

Page 190: Programowanie aplikacji dla Windows 8 (WinRT)

DemoIntegracja ze sklepem

Page 191: Programowanie aplikacji dla Windows 8 (WinRT)

DPI

System automatycznie przeskalowuje w zależności od DPI Elementy wektorowe – bez problemu Grafika – może być gorsza jakość

Page 192: Programowanie aplikacji dla Windows 8 (WinRT)

Grafika i DPI

Modern Resource Technology (MRT) Automatycznie, na podstawie nazw Uwaga – nie zmieni się w runtime <img src=„projector.jpg” width=80px height=80px /> Konwencja nazewnicza

...\projector.scale-100.jpg ...\projector.scale-140.jpg ...\projector.scale-180.jpg

Manualnie (zdarzenie)

Page 193: Programowanie aplikacji dla Windows 8 (WinRT)

Grid i typografia

Jedno z UX Guidelines Zaprojektowany, aby skalował się bez zaokrągleń

Page 194: Programowanie aplikacji dla Windows 8 (WinRT)

DemoHigh DPI

Page 195: Programowanie aplikacji dla Windows 8 (WinRT)

Zasoby i lokalizacja

Automatyczne rozpoznawanie języka (ustawienia) systemowe Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride

Katalogi i pliki *.resw Domyślny – Resources.resw x:Uid

Wybór zdjęć na podstawie kontrastu, skali, języka Pierwszeństwo zasobów nad zapisaną wartością w XAML Ręcznie

var resourceLoader = new ResourceLoader([ew. plik resw]);this.tb.Text = resourceLoader.GetString("string1");

Manifest - ms-resource:appDescription

Page 196: Programowanie aplikacji dla Windows 8 (WinRT)

Zadania MAT• Pomaga weryfikować zasoby, wykryć nowe

nieprzetłumaczone.• UI do wyboru języka.• Wykorzystuje standard XLIFF file format.

• OASIS XML Localisation Interchange File Format (XLIFF) TC• https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=xliff

• Dostarcza motor pseudo-języka, co pomaga zidentyfikować problemy podczas developmentu

• Pozwala wykorzystać Microsoft Translator (sugestie, może tłumaczenie).

• Nie pomaga w „uresourceowieniu” aplikacji – to robota programisty!

• Wsparcie korekty

Page 197: Programowanie aplikacji dla Windows 8 (WinRT)

Skórki

<ResourceDictionary.ThemeDictionaries> <ResourceDictionary x:Key="Default"> <x:String x:Key="BackButtonGlyph">&#xE071;</x:String> <x:String x:Key="BackButtonSnappedGlyph">&#xE0BA;</x:String> </ResourceDictionary>

<ResourceDictionary x:Key="HighContrast"> <x:String x:Key="BackButtonGlyph">&#xE0A6;</x:String> <x:String x:Key="BackButtonSnappedGlyph">&#xE0C4;</x:String> </ResourceDictionary> </ResourceDictionary.ThemeDictionaries>

Page 198: Programowanie aplikacji dla Windows 8 (WinRT)

DemoZasoby

Page 199: Programowanie aplikacji dla Windows 8 (WinRT)

Animacje

Animacje Nowe elementy StoryBoardów Np. Popin/PopoutAnimation

Content Transitions Popup Page Content Control (kontenery typu Grid, StackPanel, itp.)

Page 200: Programowanie aplikacji dla Windows 8 (WinRT)

DemoAnimacje

Page 201: Programowanie aplikacji dla Windows 8 (WinRT)

MVVM – po co?

Separacja warstw Testowanie Wsparcie Blend

Page 202: Programowanie aplikacji dla Windows 8 (WinRT)

Model-View-ViewModel

Widok Jak wyświetlić informację?

View Model Którą informację wyświetlić? Interakcja, przepływ

Model Obiekty reprezentujące dane Logika biznesowa

Model

View Model

View Platform-specific

PortableReferences

Databinds

Page 203: Programowanie aplikacji dla Windows 8 (WinRT)

DemoMVVM Light Toolkit

Page 204: Programowanie aplikacji dla Windows 8 (WinRT)
Page 205: Programowanie aplikacji dla Windows 8 (WinRT)

Problem z class libraries i przenośnością...

Page 206: Programowanie aplikacji dla Windows 8 (WinRT)

Portable Class Libraries

Jedno źródło Jeden projekt Jeden plik binarny Wiele platform!

Page 207: Programowanie aplikacji dla Windows 8 (WinRT)

Dostępne mechanizmy

Page 208: Programowanie aplikacji dla Windows 8 (WinRT)

Aplikacja cross-platform

Startup

Views

Windows Store App

Platform specific functionality

View Models

Models

Portable Class Library

Platform functionality abstractions

Startup

Views

Windows Phone App

Platform specific functionality

Reference Reference

Page 209: Programowanie aplikacji dla Windows 8 (WinRT)

DemoPortable Class Libraries i MVVM

Page 210: Programowanie aplikacji dla Windows 8 (WinRT)

Nieco bardziej komplikujemy...

Nawigacja IoC

Ninject Autofac

async ...

Page 211: Programowanie aplikacji dla Windows 8 (WinRT)

DemoNieco bardziej skomplikowany przykład...

Page 212: Programowanie aplikacji dla Windows 8 (WinRT)

Potrzebujemy jeszcze Android, iOS?

HTML 5 – Apache Cordova aka PhoneGap Xamarin Framework

Cross-plaformowy C# Generics, Linq, Async, ...

Bazuje na Mono Komercyjny (400 USD / platforma)

Trial w pełni sprawny (emulator) iOS (potrzebny MAC), MonoDevelop Android – także Visual Studio!

Page 213: Programowanie aplikacji dla Windows 8 (WinRT)

MvvmCross

Bazuje (już) na Portable Class Libraries Cross-platformowość

iOS Android Windows Phone Windows 8

Bazuje na konwencjach (podobnie jak Caliburn.micro)

Page 214: Programowanie aplikacji dla Windows 8 (WinRT)

Wybrane zagadnienia (luźne)

Page 215: Programowanie aplikacji dla Windows 8 (WinRT)

Debugowanie komponentów WinRT

Nie można debugować jednocześnie kodu JS i managed (np. komponent)

Page 216: Programowanie aplikacji dla Windows 8 (WinRT)

WinMD i managed code

Ildasm /project – włączenie adaptera Bez tego – widzimy jak zapisane na dysku Z parametrem project – widzimy tak jak widzi CLR

Page 217: Programowanie aplikacji dla Windows 8 (WinRT)

Typy WinRT

Kategoria PrzykładStandard WinRT types Windows.Foundation.Collections.PropertySet,

Windows.Networking.Sockets.DatagramSocketPrimitive types Byte, Int32, String, ObjectProjected types Windows.Foundation.Uri,

Windows.Foundation.DateTimeProjected interfaces Windows.Foundation.Collections.IVector<T>,

Windows.Foundation.IclosableTypes with .NET helpers Windows.Storage.Streams.IInputStream,

Windows.Foundation.IasyncInfo