5. Hello, world w C++
#include<iostream.h>
int main()
{
cout << "Hello World" << endl;
return 0;
}
6. 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),
7.
8. 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
9. .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
10.
11. NUI
iPad – 2010 r.
15 milionów urządzeo 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
13. WinRT
W przeciwieostwie 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
15. 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)
20. Duży zasięg
Integracja z przeglądarką
Transparentny proces
Różne modele biznesowe
Wysoki zysk dla programistów
Windows Store
21. 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
22. 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)
23. Sideloading - group policy
HKEY_LOCAL_MACHINESoftwarePoliciesMicrosoftWindowsAppx
AllowAllTrustedApps = 1
25. 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=b809e47cd0110a4db0
43b3f73e83acd917fe1336
29. 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
30. 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
37. 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ąd weryfikację
$.support.cors = true;
http://api.jquery.com/jQuery.support/
38. 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
42. 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
43.
44. 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 zatrzymad – e.Handled = true
46. Dependency Property
public static readonly DependencyProperty
MyNumberProperty = DependencyProperty.Register(
"MyNumber",
typeof (int),
typeof (MyDependencyObject),
new PropertyMetadata(2, OnMyNumberPropertyChange));
47. 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
48. Attached Property
public static readonly DependencyProperty IsShareButtonProperty =
DependencyProperty.RegisterAttached(
"IsShareButton",
typeof(Boolean),
typeof(MagicButton),
new PropertyMetadata(false,
new PropertyChangedCallback(Changed)));
50. Bindowanie
POCO
WinRT + BindbleAttribute lub ICustomPropertyProvider
<TextBlock Text="{Binding ElementName=Slider, Path=Value}"/>
<TextBlock Text="{Binding RelativeSource={RelativeSource Self},
Path=FontSize}"/>
51.
52.
53. Two-way binding
Dependency Properties
INotifyPropertyChanged
Zdarzenie PropertyChanged
Czasem łączenie z CallerMemberName
Model danych nie powinien byd z UI – często konieczna implementacja
54. Binding - inne
Konwertery
Statyczne zasoby
Lokalne
Globalne
55. 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();
}
57. 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
59. 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>
67. Wywoływanie kodu natywnego z C#
DllImport "avicap32.dll" "capCreateCaptureWindow"
static extern int
string int
int int int int
int int
DllImport "avicap32.dll"
static extern bool
int
MarshalAs UnmanagedType ref string
int
MarshalAs UnmanagedType ref string
int
// więcej i więcej w podobny sposób...
68. ...a w Windows 8
using Windows.Media.Capture;
var new CameraCaptureUI
new Size
var await CameraCaptureUIMode
if
var new BitmapImage
await FileAccessMode
69. 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:WindowsSystem32WinMetadata
Projekcje językowe
75. 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ć
76. 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
77. 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
78. 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
79. Dystrybucja komponentów WinRT
Nie mogą byd dystrybuowane w sklepie samodzielnie
Nie mogą byd współdzielone pomiędzy aplikacjami
Mogą byd sprzedawane developerom
81. 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
DownloadDataAsync ProcessData
ProcessDataDownloadData
83. 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#
84. Asynchroniczność w C#
Task<T>
async, await
Automatyczna transformacja na callbackową maszynę stanów
Asynchroniczne metody
Oznaczone nowym słowem kluczowym “async”
Muszą zwracad void lub Task<T>
Wykorzystują operator “await” do przekazania kontroli
Wskrzeszane, kiedy operacje zostają zakooczone
Łą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
85. 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
86. Task t, t1, t2 = ...
// Task chaining
Task 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 t2
Task t4 = t.WhenAll(taskCollection);
// Oczekiwanie na zakończenie tasków
Task.WaitAll(taskCollection);
Task.WaitAny(taskCollection);
Taski - łączenie
87. // 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
88.
89.
90. 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>
92. 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
93. 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
97. 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!
98. Zapis stanu - najlepsze praktyki
Scenariusz Powinniśmy….
99. 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 )
{
}
// …
}
100. 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
101. 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
103. Podstawowy szablon projektu
SuspensionManager
Zarządzanie stanem aplikacji (lokalny dla stron, globalny)
Serializuje wynik pracy do:
%userprofile%appdatalocalpackages...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)
104. 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, ...]
105. 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ę
108. LayoutAwarePage - nawigacja
GoBack, GoHome, GoForward
Mysz - wstecz / dalej
Klawiatura – wstecz / dalej
Domyślnie – zawsze nowa instancja po back (inaczej niż w WP)
Możliwośd zmiany NavigationCacheMode – zachowanie jak w WP
109. Zarządzanie stanem wizualnym
WindowSizeChanged
Zmiana stanu (filled / snapped, itp.)
Zmiana orientacji ekranu
Visual States
FullScreenLandscape
Filled
FullScreenPortrait
Snapped
113. 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
114. 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();
}
115. // Parse the JSON data
var 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;
}
}
116. 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 elastycznie
MyObject obj = JsonConvert.DeserializeObject<MyObject>(jsonEncodedString);
117. 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()
122. 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 byd powiązane
CollectionViewSource - this.groupedItemsViewSource.View.CollectionGroups;
123. <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 in
cvsActivities.Source = result;
// Dla zoomout
this.groupGridView.ItemsSource = this.cvsActivities.View.CollectionGroups;
127. 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
128. 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);
}
129. 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)
130. 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
131. 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));
133. 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
}
134. Długie przetwarzanie
shareOperation.ReportStarted();
Od tego momentu brak interakcji z aplikacją share’ującą
Użytkownik może zamknąd okno share i wrócid do aplikacji
shareOperation.ReportDataRetreived(); (opcja)
Po pobraniu danych z DataPackage
Zgłasza mozliwośd uśpienia / zamknięcia aplikacji źródłowej - optymalizacja
Może byd 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 zakooczenia
Zapisanie quicklinka i (samodzielnie) identyfikatora np. w bazie
shareOperation.ReportError(txt);
Przerwanie operacji, toast + komunikat o błędzie
135. 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)
137. 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
138. 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)
140. 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
141. Ustawienia - kod
SettingsPane.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);
}
143. Zapisywanie danych
Katalog instalacyjny
App data
Ustawienia lokalne – ApplicationData.Current.LocalSettings
Kontenery - proste grupowanie ustawieo
Composite
ms-appdata://local //roaming //temp
Pliki, sesja – ApplicationData.Current.LocalFolder
User data
Dokumenty, zdjęcia, muzyka, filmy
Roaming
144. 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 byd composite
ApplicationData.Current.SetVersion – aby uniknąd problemów z wersjonowaniem
DataChangedHandler
149. 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
150. 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
152. Shareowanie z osobami w pobliżu
// Rejestrujemy w klasyczny sposób kontrakt do share’owania
function 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;
}
156. 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
158. 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
160. 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
163. 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;
}
164. Aplikacje, które mogą
działad w tle
Zwłaszcza aplikacje
komunikacyjne (poczta,
komunikator, VoIP)
Okresowe uruchamianie
Uruchamianie kodu w
odpowiedzi na zdarzenia
systemowe
167. 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 ograniczeo)
Dotyczy tylko faktycznej pracy CPU!!!
168. 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
172. 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 aktualizacji
Lokalne API
Notyfikacje PUSH
173. 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();
177. Secondary Tiles
„Pinowanie” zawartości z wewnątrz aplikacji
Proste wywołanie API
Użytkownik potwierdza (systemowe UI)
Personalizowana przestrzeo aplikacji
Takie same możliwości jak główne kafelki
Tylko lokalne obrazy
Uruchomienie przekierowuje do określonej sekcji aplikacji
181. Notyfikacje PUSH - WNS
Zdalne zmiany kafelków i notyfikacje Toast (Internet)
Także, kiedy aplikacja jest wyłączona
Skalowalne, bezpłatne
182. PUSH – schemat działania
1. Żądamy URI kanału PUSH
2. Rejestracja w naszej usłudze
3. Uwierzytelnienie i wysłanie notyfikacji
183. 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
184. 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
186. 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
187. Konwersja z Trial
private 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..
}
}
188. In-app purchase
var 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
}
}
195. 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ęd na podstawie kontrastu, skali, języka
Pierwszeostwo 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
196. • 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
202. Model-View-ViewModel
Widok
Jak wyświetlid informację?
View Model
Którą informację wyświetlid?
Interakcja, przepływ
Model
Obiekty reprezentujące dane
Logika biznesowa
Databinds
212. 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!
213. MvvmCross
Bazuje (już) na Portable Class Libraries
Cross-platformowośd
iOS
Android
Windows Phone
Windows 8
Bazuje na konwencjach (podobnie jak Caliburn.micro)
216. WinMD i managed code
Ildasm /project – włączenie adaptera
Bez tego – widzimy jak zapisane na dysku
Z parametrem project – widzimy tak jak widzi CLR
217. Typy WinRT
Kategoria Przykład
Standard WinRT types Windows.Foundation.Collections.PropertySet,
Windows.Networking.Sockets.DatagramSocket
Primitive types Byte, Int32, String, Object
Projected types Windows.Foundation.Uri,
Windows.Foundation.DateTime
Projected interfaces Windows.Foundation.Collections.IVector<T>,
Windows.Foundation.Iclosable
Types with .NET helpers Windows.Storage.Streams.IInputStream,
Windows.Foundation.IasyncInfo