-
2013
681.3.06
32.973.26-018.2
88
88
, . .
Windows 8 C# / . . ,
. . , . . . .: -, 2013. 416 .: .
( )
ISBN 978-5-9775-0846-9
Windows Store- Windows 8
C# Visual Studio 2012. .
. c
, , , , . , Windows Store.
681.3.06
32.973.26-018.2
:
.
.
31.10.12.
1
70 100 /16. . . . . 33,54.
3000 .
"-", 191036, -, ., 20.
""
199034, -, 9 , 12/28
ISBN 978-5-9775-0846-9
. ., . ., . ., 2013
, "-", 2013
Windows,
.......................................................................................................... 9
.......................................................................................................................... 11
....................................................................................................... 11
.................................................................................................................. 12
................................................................................................................................ 14
1. Windows 8 .................................................................................. 15
Windows Store-........................................................................................................... 16
............................................................................................................... 21
Windows Store- ............................................................................................. 23
............................................................................................................................................... 25
2. .......................................................................................... 26
............................................................................................................................................... 30
4. .................................................... 53
.................................................................................. 53
............................................................................................................. 56
............................................................................... 60
.................................................................................... 61
........................................................................... 62
................................................................................................................... 64
.................................................................................................67
............................................................................................................................................... 68
5. .......................................................................................... 69
..................................................................................................... 70
............................................................................................................... 72
............................................................................................................................................... 75
6. ...................................................................................... 77
C ..................................................................................................... 79
IsSticky ............................................................................................................................ 83
................................................................................... 83
............................................................................................................................................... 86
9.
.................................................................................. 125
............................................................................................ 126
Visual State Manager ..................................................................................................................... 130
................................ 133
............................................................................................................................................. 135
10. .
................................................................................................. 136
............................................................................................... 136
.................................................................................... 139
/ .................................................................................... 139
........................................................................................................................... 142
........................................................................................................... 146
............................................................................................................................................. 150
................................................................................................ 166
.......................................................................................................................... 169
........................................................................................... 170
......................................................................................... 171
............................................................................................................................ 172
............................................................................................................... 173
............................................................... 175
............................................................................................................... 177
............................................................................................................................................. 179
......................................................................................... 314
............................................................................................................316
............................................................................................................................................. 318
23. ,
Windows 8 .............................................................. 320
............................................................................................. 321
1. ...........................................................................................321
2. ? .......................................................................... 324
3. ....................................................................................... 325
4. ................................................................................................329
5. .................................................................................... 344
............................................................................................................................................. 353
.......................................................................................................... 371
1. XAML .................................................................... 373
........................................................................................................... 376
................................................................................................................. 378
XAML- ........................................................................................ 381
................................................................................................ 383
............................................................................................................. 384
..................................................................................................................... 389
DataContext............................................................................................................ 392
................................................................................................. 396
............................................................................................................................................. 398
2. C# 5 ...................................... 399
async await C# 5......................................................................................... 403
............................................................................................................................................. 407
.............................................................................................. 409
Windows,
Windows
1985 .
1,3 !
.
,
, .
Windows . Windows 8 Microsoft,
, "" .
Windows 8 Microsoft
Office, Windows Phone, Visual Studio, Outlook.com ( Hotmail), Microsoft
Account ( Live ID), , . . , Microsoft , Windows
.
, . Windows ,
, .
Windows 8
.
Windows Store. Windows . , , , ( ,
) , . Windows Store , ,
Windows, , .
10
Windows,
, , , C# XAML,
Microsoft, C++ DirectX, ,
HTML 5 JavaScript, Web- .
Windows Windows 3.1. ,
, ,
, .
, , , . . .
, , ,
Windows 8.
.
. , , , , !
Microsoft
mik@microsoft.com
http://twitter.com/mixen
Windows Store- Windows 8. API .
C#,
.
C# , - , Java,
. API (Application Programming Interface, ) Windows 8, C# . C# .
:
Microsoft .NET, WPF,
Silverlight, ASP.NET . .,
Windows 8 .
Windows, Win32 API, MFC, Qt . .,
Windows 8.
, ,
Windows Phone, Windows Mobile, Android iOS, Windows 8.
, Windows 8, , . , , .
12
24- .
.
1 Windows 8.
Windows Store-.
2 ,
Windows Store-: Microsoft Visual Studio, Blend . .
3 Windows 8
, . Windows Store- , .
4 Windows Store-
C#. ,
, .
5
: .
6 (Application Bar) Windows Store-. .
7 RSS- Grid App.
8 GridView ListView,
Windows Store-. , .
9 (
320 ) VSM (Visual State
Manager)
.
10
Windows 8, ,
.
11 , ,
Push-, .
12 (Tiles) .
13
Windows 8 Windows Store-. .
14 (Share),
Windows Store-.
13
"-". , , .
15 "-" ""
(Settings), .
16 " " .
, . Windows 8
. , . , . , . SQLite.
17 .
, Windows Store-
.
. , .
, .
18 c Web- / , ,
. , .
19
Microsoft.
20 : ,
, , .
, ,
,
.
21 Windows Store-.
,
.
22 Windows 8. Windows 8, Microsoft (, Windows Phone, Xbox 360 Visual Studio 2012), , . ,
.
23
Windows 8.
, , ,
, Windows 8 Windows
Phone, (UX UI).
14
( ) Windows 8 ,
Web-. "" , , .
, , ,
, ( ) . Windows Store , .
24 Windows Store. , .
, .
Windows App Certification Kit , , ,
. .
1 XAML XAML-.
2 . , , async await
C# 5.
ftp://ftp.bhv.ru/9785977508469.zip www.bhv.ru.
, :
, , , ,
, , .
, , .
"-" ,
.
Taa1
Windows 8
, Apple iPad,
Windows
, :
1. ,
(Windows 8 , ,
ARM-) , , ,
.
2. (-).
3. .
Windows,
Microsoft
, , .
Windows 95
.
Windows 8 .
Windows Windows Store ,
( ) , , .
, Windows 7, Windows 8.
Windows Store , Windows Runtime (WinRT). Windows Store-. Windows 8 . ,
(. 1.1).
Windows Runtime Windows API " " Win32 API. Windows
:
16
1. Windows-.
2. Windows Store-.
Windows Store- C# Windows Runtime
. , API .
. 1.1. Windows 8
Windows Store-
, Windows Store-
( , "", "" ""),
. ,
(. 1.2).
Windows Store- ,
( 30
). (. 1.3):
(Full Screen);
( ) (Snapped).
320 ;
Windows 8
17
. 1.2. Windows 8,
. 1.3.
(Filled).
, Windows Store. ,
1366768 . ,
Windows Store-.
, Windows Store- (. 1.3), . , , (Portrait) ( . 1.3).
(Landscape) .
18
Windows Store- , , , .
.
, . API
, Windows 8 , .
Windows Store- , , , , .
(App Bar) "-" (Charms).
, Windows Phone,
Windows 8 .
(. 1.4) ,
(
: ).
( , , ), . ,
. , , , , , (, ) ( , -
). :
, . , , ,
, .
. 1.4.
Windows 8
19
, , .
, . .
"-";
-
. ,
, .
;
, -
, ;
;
"" Windows, , -
. 1.5. "-"
"-" ,
(, , )
.
, "" (Tile) (. . 1.1). ,
. ,
, .
20
Web-, Push-.
Windows Store- .
, . 1.6.
. 1.6. ,
(Secondary Tiles) .
.
, , "-" , .
Windows Store- ,
.
Windows 8
21
Windows
API: (native) Win32 API
(managed) .NET Framework. ,
( WPF, Windows Presentation Foundation), , , .
, Windows, . . Win32 API . , COM (Component Object Model),
90- . . , , ,
-, , . . , ,
, . Windows 95 , Windows 8 .
, Windows, Microsoft ,
API, , (native) , . Windows Runtime (WinRT).
Windows Runtime , (API),
. , 50 ,
. . "" .
2.
22
, , ,
COM C#. .NET
Framework WinRT .
, JavaScript,
HTML 5, XAML (eXtensible Application
Markup Language ).
XAML WPF Silverlight. XAML Windows Phone. XAML Windows
Runtime, ,
Windows.
Windows Store- . , . , . , , ,
,
. , , . .
Windows 8 . 1.7.
. 1.7. Windows 8
Windows Store- C#
XAML. . C# , ,
http://bhv.ru/books/book.php?id=188312. XAML 1.
Windows 8
23
Windows Store-
Windows Store- ()
, Microsoft,
.
Windows 8, Windows Phone, Xbox, Web- ,
http://outlook.com .
Windows 8 Microsoft
(Bauhaus), ( International Typographic
Style) (Motion Design).
, : , , ,
(. 1.8). , . , ,
.
, . , . -
. 1.8. Windows 8
24
, . . Windows Store- , . ,
, , ,
.
( , , ,
- :
). ,
( ), . .
" " . . Windows Store- , . , ,
Windows 8.
Windows Store- - . ,
. , iPad iBooks,
. .
. Windows (. 1.9). ""
. 1.9.
Windows 8
25
, , -
( ).
, . , , (
). Windows 8, , . .
, ,
. Windows 8 ,
, . ,
, .
Windows 8,
Windows Runtime (WinRT),
Windows Store-.
Windows .
Windows 8 ,
, Windows.
Windows
Store-, .
Taa2
Windows,
Windows Store-, Windows- MSDN (Microsoft Software Development Network):
http://msdn.microsoft.com/windows
:
http://msdn.microsoft.com/ru-ru/windows
Windows- SDK (Software
Development Kit), , . .
Windows Store- x86 x64
Windows 8. Windows Store-
Windows Windows RT ARM- .
Windows 8, (
) 90- . 90-
, . ,
Windows Store-,
Windows .
,
DreamSpark Premium,
Windows 8. .
, Windows 8, Windows Store-.
Microsoft
Visual Studio, . Microsoft
Express- Visual Studio 2012, Windows Store. Visual Studio Express 2012 for
Windows 8. Windows Store- -
27
28
29
30
. ,
, .
.
Multilingual App Toolkit for Visual Studio 2012 Visual Studio,
Windows Store-. .
Remote Tools for Visual Studio 2012
, Visual
Studio. Windows Store- Windows RT, ARM-,
Visual Studio .
Sample app pack Windows Store-,
. , , Sample app
pack , .
, Bing Maps SDK.
19.
Taa3
Windows Store-
Visual Studio,
Windows Store-.
"Hello World", . ,
, , ,
, c ARM- Windows RT.
Visual Studio
Visual Studio Express 2012 for Windows 8
Visual Studio 2012, .
, Express-.
,
. Windows Store , Visual Studio 2012 .
Visual Studio Express ,
(. 3.1). Visual Studio Windows Store-,
Visual Studio.
Windows Store Windows 8 Windows Store. , , ,
( ). , . . .
32
, .
Windows Store. ,
Windows Store . Windows Store, .
. 3.1.
I Agree.
, .
Microsoft (Microsoft
account, Windows LiveID).
(. 3.2) Sign in.
, (. 3.3).
,
Visual Studio Express STORE | Acquire Developer Licence... PROJECT |
Store | Acquire Developer Licence... Visual Studio.
Windows Store-. File |
New Project. New Project
Installed | Templates Visual C#, Windows
Store. New Project , Blank App (XAML). Name ,
HelloWorldApp, Location , . OK (. 3.4). -
Windows Store-
33
. 3.2. Microsoft
. 3.3. ,
34
, .
. (Tile) (
. 3.6, ).
Windows Store-
35
. 3.6.
Windows Store-, ,
. Solution
Explorer Visual Studio (. 3.7).
MainPage.xaml
XAML. , . App.xaml.cs,
.
MainPage.xaml. ,
. Windows 8 ,
, . Windows Store . 4.
MainPage.xaml.cs (code-behind) C#
MainPage.xaml. - ,
xaml.cs.
36
MainPage.xaml.cs. ,
MVVM (Model-View-ViewModel),
, -
.
, , MVVM.
App.xaml Windows Store-
XAML.
. App.xaml . ,
, , .
( ) .
. 3.7.
Windows Store-
App.xaml 3.1.
3.1. App.xaml
<Application
x:Class="HelloWorldApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:HelloWorldApp">
<Application.Resources>
<ResourceDictionary>
Windows Store-
37
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Common/StandardStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
StandardStyles.xaml.
.
App.xaml.cs (code-behind) C# App.xaml.
, , , , .
, App.xaml.cs .
StandardStyles.xaml . , App.xaml
. ,
, . StandardStyles.xaml
, ,
. -
.
Package.appxmanifest . , , (Tiles) (Splash Screen), , . . ,
XML-, ,
Visual Studio (. 3.8).
Package.appxmanifest Solution Explorer.
Application UI, Capabilities, Declarations
Packaging, .
, , 3.2
Package.appxmanifest . ,
, Publisher, .
3.2. Package.appxmanifest
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
<Identity Name="f1e59aea-15c7-4515-89ba-1976f2499f4f"
Publisher="CN=v-sepuga"
Version="1.0.0.0" />
38
<Properties>
<DisplayName>HelloWorldApp</DisplayName>
<PublisherDisplayName>v-sepuga</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Prerequisites>
<OSMinVersion>6.2.1</OSMinVersion>
<OSMaxVersionTested>6.2.1</OSMaxVersionTested>
</Prerequisites>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="HelloWorldApp.App">
<VisualElements
DisplayName="HelloWorldApp"
Logo="Assets\Logo.png"
SmallLogo="Assets\SmallLogo.png"
Description="HelloWorldApp"
ForegroundText="light"
BackgroundColor="#464646">
<DefaultTile ShowName="allLogos" />
<SplashScreen Image="Assets\SplashScreen.png" />
</VisualElements>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
</Capabilities>
</Package>
AssemblyInfo.cs ,
(Assembly) .
HelloWorldApp_TemporaryKey.pfx -
, .
Logo.png, SmallLogo.png, StoreLogo.png -
, . , . .
. , . -
Windows Store-
39
. 3.8.
,
12.
,
.
SplashScreen.png , . ,
, . - .
References,
.NET-.
(Assemblies) (Frameworks), .
40
(. 3.9)
MainPage.xaml
Solution Explorer. , Windows
Store-, C#,
XAML (. 1). Visual Studio XAML , WYSIWYG (What You See Is What
You Get, " , "). Visual Studio Windows Store- . WYSIWYG,
, XAML-.
, , , ,
, ,
, , XAML-
.
. 3.9.
Windows Store-
41
, ,
Toolbox Properties, XAML- .
XAML-.
, XAML-
MainPage.xaml ( 3.3).
3.3.
<Page
x:Class="HelloWorldApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:HelloWorldApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc=
"http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
</Grid>
</Page>
System;
System.Collections.Generic;
System.IO;
System.Linq;
Windows.Foundation;
Windows.Foundation.Collections;
42
using
using
using
using
using
using
using
Windows.UI.Xaml;
Windows.UI.Xaml.Controls;
Windows.UI.Xaml.Controls.Primitives;
Windows.UI.Xaml.Data;
Windows.UI.Xaml.Input;
Windows.UI.Xaml.Media;
Windows.UI.Xaml.Navigation;
namespace HelloWorldApp
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
}
}
Grid , (HorizontalAlignment="Center"),
(VerticalAlignment="Center"). (. 3.10).
.
XAML-
Click Button. Click XAML-
(<New Event Handler>)
Windows Store-
43
(. 3.11).
. ,
Button_Click_1. . , .
. 3.11.
C#- ,
XAML- Navigate
to Event Handler. C#-,
( 3.6).
3.6.
public sealed partial class MainPage : Page
{
public MainPage()
44
3
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
}
. . "Hello
World!" ( 3.7).
3.7.
private void Button_Click_1(object sender, RoutedEventArgs e)
{
var dlg = new MessageDialog("Hello World!");
dlg.ShowAsync();
}
. (. 3.12).
MessageDialog Windows.UI.Popups , , . ( 3.8).
Windows Store-
45
3.8.
var dlg = new MessageDialog("Hello World!", "");
dlg.ShowAsync();
. :
1, 2 3 ( 3.9). , .
(dlg.DefaultCommandIndex = 1).
<Enter>. , <Escape>.
.
, Button_Click_1 , async.
await ( async await 2).
, .
, ,
Id, .
3.9.
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
var dlg = new MessageDialog("Hello World!", "");
dlg.Commands.Add(new UICommand(" 1",
new UICommandInvokedHandler((args) =>
{
//
})));
dlg.Commands.Add(new UICommand(" 2"));
dlg.Commands.Add(new UICommand(" 3") { Id = 3 });
dlg.DefaultCommandIndex = 1;
dlg.CancelCommandIndex = 2;
var command = await dlg.ShowAsync();
}
.
. 3.13.
46
. 3.13.
, MessageDialog ,
. , .
.
,
, , , ,
. 1366768 , . . ,
, , ,
. .
, . . , . . Windows, , .
(Remote
Desktop, RDP).
Local Machine Simulator (. 3.14).
.
(. 3.15).
Windows,
, .
,
, .
Windows Store-
47
. 3.14.
. 3.15.
Start, "-"
.
13 .
.
(Minimize).
(Always on top).
,
(Mouse mode).
, (-
48
.
90 (Rotate clockwise (90 degrees)).
90 (Rotate counterclockwise
(90 degrees)).
(Change resolution).
(Set location).
(Copy screenshot).
(Screenshot settings).
(Help).
,
. . (. 3.16).
. 3.16.
, , 10,6 ,
. ,
( PPI, Pixels Per Inch). , ,
. , 9.
. , -
Windows Store-
49
, .
, , ,
, . ,
.
, ,
.
, , , .
Remote Tools for Visual Studio 2012. ,
. ,
.
, , . 3.17.
. 3.17.
Visual Studio.
Remote Machine . (. 3.18).
. .
,
, . ,
- . , . , .
, Visual Studio Express
STORE | Create App Packages... PROJECT | Store | Create App
Packages... Visual Studio. Windows Store. "" (No)
(. 3.19).
50
. 3.18.
. 3.19.
Windows Store-
51
Next, ( ). Create.
appx, (. 3.20). appx . ZIP-,
, ,
HelloWorldApp_1.0.0.0_AnyCPU_Debug.appx zip
.
PowerShell ps1,
,
.
Windows PowerShell Microsoft,
.
PowerShell Windows 8.
. 3.20.
PowerShell Add-AppDevPackage.ps1. ,
.
52
Taa4
Windows Store-: . 3 , MainPage.xaml,
. , Web. Web-
Windows Store- ( ).
, , (,
), . ,
Windows Store- Web-. Windows Store-,
JavaScript, . , C#, HTML- JavaScript XAML-
C#. CSS ,
XAML-.
"Hello World" ,
, ,
.
3 MainPage.xaml. App.xaml.cs. ( 4.1).
4.1. C#- App.xaml
using System;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
54
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace HelloWorldApp
{
/// <summary>
/// , ,
/// Application
/// </summary>
sealed partial class App : Application
{
/// <summary>
/// App
/// Singleton
///
///
/// main() WinMain()
/// </summary>
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
}
/// <summary>
/// ,
///
/// ,
/// ,
/// . .
/// </summary>
/// <param name="args"> .</param>
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Frame rootFrame = Window.Current.Content as Frame;
//
//
//
if
{
,
,
,
(rootFrame == null)
// Frame,
//
rootFrame = new Frame();
if (args.PreviousExecutionState ==
ApplicationExecutionState.Terminated)
{
// TODO: ,
// Terminated
}
// Frame
//
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
// ,
//
//
//
if (!rootFrame.Navigate(typeof(MainPage),
args.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
// ,
Window.Current.Activate();
}
/// <summary>
///
/// (suspended)
/// ,
/// (tetminated)
/// (resumed)
/// ,
///
/// </summary>
/// <param name="sender"> .</param>
/// <param name="e"> .</param>
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
// TODO:
//
deferral.Complete();
}
}
}
55
56
App, Application,
Package.appxmanifest . ( , ). Main() .NET- (
main() WinMain() , C/C++).
( ) OnLaunched .
, . .
,
, OnLaunched Frame.
. .
( 4.2).
4.2.
rootFrame.Navigate(typeof(MainPage), args.Arguments);
Navigate , .
MainPage. .
, . Navigate , .
Solution Explorer Add | New Item.... ,
, (. 4.1).
Basic Page, SecondPage.xaml Add. . Yes .
Basic Page , Blank Page. Basic
Page , "", , (. 4.2).
XAML- SecondPage.xaml 4.3. ,
,
(VisualStateManager.VisualStateGroups) , .
. 4.1.
. 4.2. SecondPage.xaml
57
58
4.3. SecondPage.xaml
<common:LayoutAwarePage
x:Name="pageRoot"
...
>
<Page.Resources>
<x:String x:Key="AppName">My Application</x:String>
</Page.Resources>
<Grid Style="{StaticResource LayoutRootStyle}">
<Grid.RowDefinitions>
<RowDefinition Height="140"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button x:Name="backButton" Click="GoBack"
IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}"
Style="{StaticResource BackButtonStyle}"/>
<TextBlock x:Name="pageTitle" Grid.Column="1"
Text="{StaticResource AppName}"
Style="{StaticResource PageHeaderTextStyle}"/>
</Grid>
<VisualStateManager.VisualStateGroups>
...
</VisualStateManager.VisualStateGroups>
</Grid>
</common:LayoutAwarePage>
59
,
Common (. . 4.2) .
( Basic Page), , .
, MainPage.xaml
SecondPage.xaml.
4.4.
4.4. SecondPage.xaml
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(SecondPage));
}
, MainPage.xaml, Frame,
.
Frame .
, ,
HyperlinkButton ( 4.5).
4.5. HyperlinkButton
<HyperlinkButton Content=" " Click="HyperlinkButtonClick"/>
Click . 4.4.
Navigate Frame
(. 4.1).
4.1. Frame
/
GoBack
. ,
GoForward
. ,
CanGoBack
, ,
CanGoForward
, ,
CurrentSourcePageType
60
SecondPage.xaml .
, Grid, SecondPage.xaml,
LayoutRootStyle ( 4.6)
4.6. Grid
<Grid Style="{StaticResource LayoutRootStyle}">
...
</Grid>
StandardStyles.xaml
, , ( 4.7).
4.7. LayoutRootStyle
<Style x:Key="LayoutRootStyle" TargetType="Panel">
<Setter Property="Background"
Value="{StaticResource ApplicationPageBackgroundThemeBrush}"/>
<Setter Property="ChildrenTransitions">
<Setter.Value>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</Setter.Value>
</Setter>
</Style>
EntranceThemeTransition, .
, Grid, .
Windows 8
. ContentThemeTransition.
:
FadeInThemeAnimation/FadeOutThemeAnimation
PointerUpThemeAnimation/PointerDownThemeAnimation
RepositionThemeAnimation/RepositionThemeTransition
PopInThemeAnimation/PopOutThemeAnimation/PopupThemeTransition
EdgeUIThemeTransition
PaneThemeTransition
AddDeleteThemeTransition
61
DragItemThemeAnimation/DropTargetItemThemeAnimation/ DragOverThemeAnimation
SwipeHintThemeAnimation/SwipeBackThemeAnimation
.
Navigate Frame. , int, string, char, Guid
. . , , ,
, . , .
4.8 .
4.8.
this.Frame.Navigate(typeof(SecondPage), " ");
, OnNavigatedTo , ( 4.9).
SecondPage.xaml.
4.9. ,
public sealed partial class SecondPage : LayoutAwarePage
{
public SecondPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
string parameter = e.Parameter as string;
base.OnNavigatedTo(e);
}
protected override void LoadState(Object navigationParameter,
Dictionary<String, Object> pageState)
{
}
62
4
protected override void SaveState(
Dictionary<String, Object> pageState)
{
}
OnNavigatedTo (
). OnNavigateTo
base.OnNavigatedTo(e). , .
, . (override) , ,
.
SecondPage LayoutAwarePage, , .
.
. .
Basic Page
LayoutAwarePage,
. Blank App,
LayoutAwarePage . , Grid App Split App,
.
Windows Store- ,
Windows-. , Windows
, .
, .
, . , ,
.
.
Windows Store- 10.
, (, , ) - . , . .
5 . , ,
,
.
63
.
SuspensionManager, SecondPage.xaml. SuspensionManager
. SuspensionManager . , SuspensionManager .
SuspensionManager App.xaml.cs ( 4.10).
4.10. SuspensionManager
protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
rootFrame = new Frame();
SuspensionManager.RegisterFrame(rootFrame, "AppFrame");
if (args.PreviousExecutionState ==
ApplicationExecutionState.Terminated)
{
try
{
await SuspensionManager.RestoreAsync();
}
catch (SuspensionManagerException)
{
//
}
}
// Frame
//
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
Window.Current.Activate();
}
64
, . ,
.
, . , .
Basic Page LoadState SaveState ( 4.11), ,
SuspensionManager.
. .
4.11. LoadState SaveState
protected override void LoadState(Object navigationParameter,
Dictionary<String, Object> pageState)
{
}
protected override void SaveState(
Dictionary<String, Object> pageState)
{
}
SuspensionManager ( 4.12).
4.12. SuspensionManager
SuspensionManager.SessionState.Add("", "");
. .
, , , , .
65
SecondPage.xaml
( 4.13).
4.13.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button x:Name="backButton" Click="GoBack"
IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}"
Style="{StaticResource BackButtonStyle}"/>
<TextBlock x:Name="pageTitle" Grid.Column="1"
Text="{StaticResource AppName}"
Style="{StaticResource PageHeaderTextStyle}"/>
</Grid>
<Grid Grid.Row="1">
<TextBox x:Name="txtMain" Width="250"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</Grid>
<VisualStateManager.VisualStateGroups>
.
. , .
,
, NavigationCacheMode.
Enabled ( 4.14),
, , .
,
.
4.14. NavigationCacheMode
public SecondPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Enabled;
}
66
NavigationCacheMode Required,
.
NavigationCacheMode , . .
NavigationCacheMode,
( , ) . , LoadState SaveState ( 4.15).
.
4.15.
protected override void SaveState(Dictionary<String, Object> pageState)
{
pageState["text"] = txtMain.Text;
}
protected override void LoadState(Object navigationParameter,
Dictionary<String, Object> pageState)
{
if (pageState == null) return;
if (pageState.ContainsKey("text"))
{
txtMain.Text = pageState["text"] as string;
}
}
,
Debug Location
Visual Studio (. 4.3). ,
VIEW | Toolbars | Debug Location.
,
.
67
HyperlinkButton NavigateUri
, ( 4.16). , .
4.16. HyperlinkButton
<HyperlinkButton NavigateUri="http://twitter.com/spugachev"
Content="@spugachev"/>
, . . http. , . (
). ,
mailto, FTP- ftp.
Launcher ( 4.17).
4.17.
Launcher.LaunchUriAsync(new Uri("http://twitter.com/spugachev"));
( 4.18).
4.18.
private async void HyperlinkButtonClick(object sender, RoutedEventArgs e)
{
var opts = new LauncherOptions();
opts.TreatAsUntrusted = true;
opts.DisplayApplicationPicker = true;
opts.PreferredApplicationDisplayName = " ";
opts.PreferredApplicationPackageFamilyName = "MyAppFamilyName";
var success
= await Launcher.LaunchUriAsync(
new Uri("someprotocol://data"), opts);
if (success)
{
//
}
else
{
//
}
}
68
TreatAsUntrusted ,
.
DisplayApplicationPicker ,
.
, , ,
Windows
Store. PreferredApplicationDisplayName PreferredApplicationPackageFamilyName. , .
Launcher .
LaunchFileAsync. ,
.
, .
Windows Store- . Launcher.
17.
App.xaml.cs, .
. , , ,
Windows Store.
.
.
.
Taa5
, .
,
. ( ), .
XAML, 1, .
ApplicationPageBackgroundThemeBrush ( 5.1).
5.1.
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
...
</Grid>
. , . , , ApplicationPageBackgroundThemeBrush, ,
. . , .
Windows Phone, ,
Windows Phone Windows 8 . Windows Phone , Windows 8 .
70
Grid App. , Grid App, ,
GroupedItemsPage.xaml.
, (. 5.1).
. 5.1. ,
(. 5.2). .
71
. 5.2. ,
App ( 5.3).
5.3.
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
RequestedTheme = ApplicationTheme.Light;
}
Visual Studio ,
( ).
Device, Visual Studio. ,
DESIGN | Device Window . Device (. 5.3).
Device
.
72
. 5.3. Device
TextBlock ( 5.4).
5.4.
<TextBlock Text="- " />
, ( 5.5).
5.5.
<TextBlock Text="- " FontFamily="Times New Roman" FontSize="24"/>
, ( , , ). , , , .
15 , . . .
( 5.6).
BasicTextStyle
5.6.
<TextBlock Text="- "
Style="{StaticResource BasicTextStyle}"/>
73
. 5.4 .
, .
. 5.4.
:
PageHeaderTextStyle
TitleTextStyle
PageHeaderTextStyle
SubtitleTextStyle
PageSubheaderTextStyle
ItemTextStyle
SnappedPageHeaderTextStyle
BodyTextStyle
HeaderTextStyle
CaptionTextStyle
SubheaderTextStyle
BasicTextStyle
GroupHeaderTextStyle
BaselineTextStyle.
. . 5.5 , . , ,
, .
StandardStyles.xaml. ,
.
. , Edit Style | Apply
Resource (. 5.6).
.
( 5.7).
5.7.
<TextBlock Text="- " Style="{StaticResource BodyTextStyle}">
<LineBreak/>
<Run Foreground="LightGray" FontFamily="Times New Roman"
FontWeight="Bold" FontSize="26">
Times New Roman Bold 26
</Run>
<LineBreak/>
<Run Foreground="Red" FontFamily="Arial" FontSize="24">
74
Arial 24
</Run>
</TextBlock>
5.7
. 5.7.
. 5.5. ,
- ,
RichTextBlock ( RichEditBox), TextBlock.
RichTextBlobk , .
, .
StandardStyles.xaml, ,
MSDN.
75
. 5.6.
. 5.7.
Windows Store-. .
App.xaml .
76
, ApplicationPageBackgroundThemeBrush
ApplicationForegroundThemeBrush, . , . StandardStyles.xaml
, .
, ,
HeaderTextStyle, , .
.
Windows Store-.
Taa6
(Application Bar)
Windows Store-.
, . ,
, . ,
Application, - , "
", ,
.
, - .
,
.
.
" " "" . .
, <Windows>+<Z>,
.
. , -
, .
,
.
, , , . , . , .
. , Internet Explorer
( , ).
. 6.1 Internet Explorer , . 6.2 .
78
79
Internet Explorer . .
, (. 6.3). .
. 6.3.
BottomAppBar TopAppBar ( 6.1). AppBar.
6.1.
<Page
...
>
<Page.TopAppBar>
<AppBar x:Name="topAppBar" Padding="10,0,10,0">
<!-- -->
</AppBar>
</Page.TopAppBar>
<Page.BottomAppBar>
80
6
<AppBar x:Name="bottomAppBar" Padding="10,0,10,0">
<!-- -->
</AppBar>
</Page.BottomAppBar>
<Grid
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
</Grid>
</Page>
( 6.2). Grid
( ).
6.2.
<AppBar x:Name="bottomAppBar" Padding="10,0,10,0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<Button />
<Button />
<Button />
</StackPanel>
<StackPanel Grid.Column="1"
HorizontalAlignment="Right" Orientation="Horizontal">
<Button />
</StackPanel>
</Grid>
</AppBar>
.
,
Windows Store-, ( ).
AppBarButtonStyle.
,
AutomationProperties.Name ( 6.3).
6.3.
<Button Style="{StaticResource AppBarButtonStyle}"
AutomationProperties.Name=""/>
81
. 6.4.
AppBarButtonStyle
. 6.4 , AppBarButtonStyle.
StandardStyles.xaml . . .
,
StandardStyles.xaml ( 6.4).
6.4.
<AppBar x:Name="bottomAppBar" Padding="10,0,10,0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal">
<Button Style="{StaticResource AppBarButtonStyle}"
AutomationProperties.Name=""/>
<Button Style="{StaticResource PageAppBarButtonStyle}" />
<Button Style="{StaticResource VideoChatAppBarButtonStyle}"/>
</StackPanel>
<StackPanel Grid.Column="1"
HorizontalAlignment="Right" Orientation="Horizontal">
<Button Style="{StaticResource BulletsAppBarButtonStyle}" />
</StackPanel>
</Grid>
</AppBar>
. 6.5. ,
. ,
AutomationProperties.Name.
. 6.5.
82
,
StandardStyles.xaml . . 6.6.
. 6.6 .
.
. 6.6.
83
IsSticky
. (
. .), IsSticky ( 6.5).
6.5. IsSticky
<AppBar x:Name="bottomAppBar" IsSticky="True">
, , IsOpen, .
.
. ,
(. 6.7).
Popup, .
.
. 6.7.
84
Popup Flyout Windows Store, JavaScript.
( 6.6). .
, (PopupThemeTransition).
6.6.
private void ButtonClick(object sender, RoutedEventArgs e)
{
Popup popup = new Popup();
popup.IsLightDismissEnabled = true;
Grid panel = new Grid();
panel.Background = bottomAppBar.Background;
panel.Height = 250;
panel.Width = 150;
panel.Transitions = new TransitionCollection();
panel.Transitions.Add(new PopupThemeTransition());
Button btnMain = new Button();
btnMain.Content = "";
btnMain.VerticalAlignment = VerticalAlignment.Center;
btnMain.HorizontalAlignment = HorizontalAlignment.Center;
panel.Children.Add(btnMain);
popup.Child = panel;
var button = (Button)sender;
var transform = button.TransformToVisual(this);
var point = transform.TransformPoint(new Point());
popup.HorizontalOffset = point.X;
popup.VerticalOffset = Window.Current.CoreWindow.Bounds.Bottom bottomAppBar.ActualHeight panel.Height 4;
popup.IsOpen = true;
}
. 6.8.
(Child),
(HorizontalOffset VerticalOffset) IsOpen true.
85
. 6.8.
,
, . PopupMenu ( 6.7).
6.7.
private async void ButtonClick(object sender, RoutedEventArgs e)
{
var popupMenu = new PopupMenu();
popupMenu.Commands.Add(new UICommand(""));
popupMenu.Commands.Add(new UICommand(""));
popupMenu.Commands.Add(new UICommand(""));
var button = (Button)sender;
var transform = button.TransformToVisual(this);
var point = transform.TransformPoint(new Point(45, -10));
await popupMenu.ShowAsync(point);
}
. 6.9.
, MessageDialog, . .
. , .
86
. 6.9.
Windows Store-. .
.
, , , StandardStyles.xaml.
.
. Popup PopupMenu.
Taa7
RSS-
Grid App
5 Grid App.
, , , , . RSS-
Grid App.
RSS- . http://blogs.msdn.com/
b/somasegar/.
. RSS-
. 7.1.
. 7.1. RSS-
88
. 7.2.
SampleDataSource.cs
. .
.
SampleDataSource.cs :
SampleDataSource
SampleDataGroup
SampleDataItem
Grid App , , . ,
. SampleDataGroup,
SampleDataItem.
, AllGroups SampleDataSource.
SampleDataSource ,
.
SampleDataSource.
_allGroups AllGroups , GetGroup
89
( SampleDataSource)
( 7.1).
GetItem
7.1. SampleDataSource
public sealed class SampleDataSource
{
public static ObservableCollection<SampleDataGroup> _allGroups =
new ObservableCollection<SampleDataGroup>();
public static ObservableCollection<SampleDataGroup> AllGroups
{
get
{
return _allGroups;
}
}
public static SampleDataGroup GetGroup(string uniqueId)
{
var matches = AllGroups.Where((group) =>
group.UniqueId.Equals(uniqueId));
if (matches.Count() == 1) return matches.First();
return null;
}
public static SampleDataItem GetItem(string uniqueId)
{
var matches = AllGroups.SelectMany(group =>
group.Items).Where((item) => item.UniqueId.Equals(uniqueId));
if (matches.Count() == 1) return matches.First();
return null;
}
}
RSS.
SyndicationClient
Windows.Web.Syndication. RSS-
Atom-, ( 7.2). ,
SyndicationClient , ,
.
RSS, .
HTTP, HttpClient. , HTTP, Socket API.
90
Windows 8 . Web-.
.
7.2. RSS-
var feedClient = new SyndicationClient();
var feed = await feedClient.RetrieveFeedAsync(new Uri(feedUrl));
SampleDataSource AddGroupForFeedAsync,
( 7.3).
7.3.
public static async Task<bool> AddGroupForFeedAsync(string feedUrl)
{
// , false
if (SampleDataSource.GetGroup(feedUrl) != null) return false;
var feedClient = new SyndicationClient();
var feed = await feedClient.RetrieveFeedAsync(new Uri(feedUrl));
var feedGroup = new SampleDataGroup(
uniqueId: feedUrl,
title: feed.Title != null ? feed.Title.Text : null,
subtitle: feed.Subtitle != null ? feed.Subtitle.Text : null,
imagePath: feed.ImageUri != null ?
feed.ImageUri.ToString() : null,
description: null);
AllGroups.Add(feedGroup);
return true;
}
SampleDataGroup AllGroups.
. ( ) ,
HTML- . GetImageFromPostContents ( 7.4). HTML- src href, png, jpg jpeg (, <img src="image.jpg" />).
.
91
7.4.
private static string GetImageFromPostContents(SyndicationItem item)
{
var regex = new Regex(
"[src href]\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))");
var matches = regex.Matches(item.Summary.Text);
return matches.Cast<Match>()
.Where(m =>
{
Uri url;
if (Uri.TryCreate(m.Groups[1].Value, UriKind.Absolute, out url))
{
string ext = Path.GetExtension(url.AbsolutePath).ToLower();
if (ext == ".png" || ext == ".jpg"
|| ext==".jpeg") return true;
}
return false;
})
.Select(m => m.Groups[1].Value)
.FirstOrDefault();
}
AddGroupForFeedAsync ,
SampleDataItem ( 7.5). ,
.
7.5.
public static async Task<bool> AddGroupForFeedAsync(string feedUrl)
{
// , false
if (SampleDataSource.GetGroup(feedUrl) != null) return false;
var feedClient = new SyndicationClient();
var feed = await feedClient.RetrieveFeedAsync(new Uri(feedUrl));
var feedGroup = new SampleDataGroup(
uniqueId: feedUrl,
title: feed.Title != null ? feed.Title.Text : null,
subtitle: feed.Subtitle != null ? feed.Subtitle.Text : null,
imagePath: feed.ImageUri != null ?
feed.ImageUri.ToString() : null,
description: null);
92
7
foreach (var i in feed.Items)
{
string imgPath = GetImageFromPostContents(i);
if (imgPath != null && feedGroup.Image == null)
{
feedGroup.SetImage(imgPath);
}
var dataItem = new SampleDataItem(
uniqueId: i.Id,
title: i.Title.Text,
subtitle: null,
imagePath: imgPath,
description: null,
content: i.Summary.Text,
@group: feedGroup);
feedGroup.Items.Add(dataItem);
}
AllGroups.Add(feedGroup);
return true;
, . .
GroupedItemsPage.xaml. ( 7.6).
7.6.
GroupedItemsPage.xaml
protected async override void LoadState(Object navigationParameter,
Dictionary<String, Object> pageState)
{
this.DefaultViewModel["Groups"] = SampleDataSource.AllGroups;
//
await SampleDataSource.AddGroupForFeedAsync(
"http://blogs.msdn.com/b/mikcher/rss.aspx");
await SampleDataSource.AddGroupForFeedAsync(
"http://blogs.msdn.com/b/stasus/rss.aspx");
await SampleDataSource.AddGroupForFeedAsync(
"http://blogs.msdn.com/b/kichinsky/rss.aspx");
}
93
, . , , Grid App, .
. , . 7.1. GroupDetailPage.xaml (. 7.3).
- .
ItemDetailPage.xaml (. 7.4).
. 7.3. GroupDetailPage.xaml
. 7.4. ItemDetailPage.xaml
94
ItemDetailPage.xaml HTML-
. , . . HTML- . . WebView, , HTML-. HTML .
, ,
.
, 1.
LayoutAwarePage.
DefaultViewModel, -
(Dependency Property) DefaultViewModelProperty ( 7.7).
7.7. DefaultViewModel
public class LayoutAwarePage : Page
{
public static readonly DependencyProperty DefaultViewModelProperty =
DependencyProperty.Register("DefaultViewModel",
typeof(IObservableMap<String, Object>),
typeof(LayoutAwarePage), null);
...
protected IObservableMap<String, Object> DefaultViewModel
{
get
{
return this.GetValue(DefaultViewModelProperty)
as IObservableMap<String, Object>;
}
set
{
this.SetValue(DefaultViewModelProperty, value);
}
}
...
}
95
, " ",
. CollectionViewSource,
, .
CollectionViewSource Groups DefaultViewModel
( 7.10).
7.10. CollectionViewSource
<Page.Resources>
<CollectionViewSource
x:Name="groupedItemsViewSource"
Source="{Binding Groups}"
IsSourceGrouped="true"
ItemsPath="TopItems"/>
</Page.Resources>
96
7.11. GroupedItemsPage.xaml
<common:LayoutAwarePage
x:Name="pageRoot"
x:Class="RssApp.GroupedItemsPage"
DataContext="{Binding DefaultViewModel,
RelativeSource={RelativeSource Self}}"
...
mc:Ignorable="d">
<Page.Resources>
<CollectionViewSource
x:Name="groupedItemsViewSource"
Source="{Binding Groups}"
IsSourceGrouped="true"
ItemsPath="TopItems"/>
</Page.Resources>
<Grid Style="{StaticResource LayoutRootStyle}">
<Grid.RowDefinitions>
<RowDefinition Height="140"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<GridView
x:Name="itemGridView"
AutomationProperties.AutomationId="ItemGridView"
AutomationProperties.Name="Grouped Items"
Grid.RowSpan="2" Padding="116,137,40,46"
ItemsSource=
"{Binding Source={StaticResource groupedItemsViewSource}}"
ItemTemplate="{StaticResource Standard250x250ItemTemplate}"
SelectionMode="None" IsSwipeEnabled="false"
IsItemClickEnabled="True" ItemClick="ItemView_ItemClick">
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<GridView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
...
</DataTemplate>
</GroupStyle.HeaderTemplate>
97
<GroupStyle.Panel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid Orientation="Vertical"
Margin="0,0,80,0"/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</GridView.GroupStyle>
</GridView>
...
</Grid>
</common:LayoutAwarePage>
Taa8
GridView, ListView FlipView
Windows Store-
GridView ListView, , ItemsControl . GridView , ListView ( ).
, , . .
GridView
(. . 7.1). GridView , . , GridView . . 8.1 GridView .
. 8.1. GridView
. 8.2
ListView,
GridView . 8.1.
99
GridView ListView
.
GridView ,
ListView (Snapped).
ListView
GridView,
, , .
. 8.2.
ListView
GridView
GridView.
Blank App ControlsApp.
MainPage.xaml GridView
gvMain ( 8.1).
8.1. GridView
<Page
...
>
100
8
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="140"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="Controls App" Margin="120,0,30,40"
Style="{StaticResource PageHeaderTextStyle}"/>
<GridView x:Name="gvMain" Grid.Row="1" Padding="116,37,40,46">
</GridView>
</Grid>
</Page>
, GridView. Person,
, : FirstName, LastName Age
( 8.2).
8.2. Person
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
MainPage.xaml Person,
ObservableCollection<T>. , (List<T>),
. , , ListView GridView, . ObservableCollection<T> ,
.
, . .
GridView. ,
.
, ItemsControl,
(Items) . , Items ( 8.3).
101
8.3. Items
gvMain.Items.Add(
new Person { LastName = "", FirstName = "", Age = 31 });
GridView ItemsSource ( 8.4).
7 ItemsSource
XAML-:
ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
8.4. GridView
public sealed partial class MainPage : Page
{
private ObservableCollection<Person> _persons;
public MainPage()
{
this.InitializeComponent();
_persons = new ObservableCollection<Person>();
_persons.Add(new Person { LastName = "",
FirstName = "", Age = 31 });
_persons.Add(new Person { LastName = "",
FirstName = "", Age = 18 });
...
_persons.Add(new Person { LastName = "",
FirstName = "", Age = 24 });
gvMain.ItemsSource = _persons;
}
}
, .
_persons Person, .
. GridView, ,
(. 8.3).
ToString Person.
, .
"ControlsApp.Person".
102
. 8.3. GridView
GridView,
(ItemTemplate). Avatar.png,
. , 7. ( 8.5).
160160 .
8.5.
<GridView x:Name="gvMain" Grid.Row="1" Padding="116,37,40,46">
<GridView.ItemTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Left" Width="160" Height="160">
<Border Background="{StaticResource
103
ListViewItemPlaceholderBackgroundThemeBrush}">
<Image Source="/Assets/Avatar.png"
Stretch="UniformToFill"/>
</Border>
<StackPanel VerticalAlignment="Bottom"
Background="{StaticResource
ListViewItemOverlayBackgroundThemeBrush}">
<TextBlock Text="{Binding FirstName}"
Foreground="{StaticResource
ListViewItemOverlayForegroundThemeBrush}"
Style="{StaticResource TitleTextStyle}"
Margin="15,0,15,0"/>
<TextBlock Text="{Binding LastName}"
Foreground="{StaticResource
ListViewItemOverlayForegroundThemeBrush}"
Style="{StaticResource TitleTextStyle}"
Margin="15,0,15,0"/>
<TextBlock Text="{Binding Age}"
Foreground="{StaticResource
ListViewItemOverlaySecondaryForegroundThemeBrush}"
Style="{StaticResource CaptionTextStyle}"
TextWrapping="NoWrap" Margin="15,0,15,10"/>
</StackPanel>
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
Person.
. GridView -
(. 8.4). ,
, GridView
, .
, GridView
.
. 7 , . ,
.
, : , .
PersonGroup ( 8.6).
104
. 8.4.
8.6. PersonGroup
public class PersonGroup
{
public string GroupName { get; set; }
public ObservableCollection<Person> Persons { get; set; }
public PersonGroup()
{
Persons = new ObservableCollection<Person>();
}
}
GroupName,
Persons.
GridView CollectionViewSource.
( 8.7).
8.7. CollectionViewSource
<Page
...
>
105
<Page.Resources>
<CollectionViewSource
x:Name="cvsMain"
IsSourceGrouped="true"
ItemsPath="Persons"/>
</Page.Resources>
...
IsSourceGrouped true, . .
, ItemsPath Persons,
Persons PersonGroup .
CollectionViewSource GridView ( 8.8).
8.8. CollectionViewSource GridView
<GridView x:Name="gvMain" Grid.Row="1" Padding="116,37,40,46"
ItemsSource="{Binding Source={StaticResource cvsMain}}">
CollectionViewSource. ( 8.9).
8.9.
public sealed partial class MainPage : Page
{
private ObservableCollection<PersonGroup> _groups;
public MainPage()
{
this.InitializeComponent();
_groups = new ObservableCollection<PersonGroup>();
var developers = new PersonGroup { GroupName = "" };
var designers = new PersonGroup { GroupName = "" };
var managers = new PersonGroup { GroupName = "" };
_groups.Add(developers);
_groups.Add(designers);
_groups.Add(managers);
developers.Persons.Add(new Person { LastName = "",
FirstName = "", Age = 31 });
...
managers.Persons.Add(new Person { LastName = "",
FirstName = "", Age = 23 });
106
8
cvsMain.Source = _groups;
}
, (. . 8.4).
( 8.10), , . -
.
.
8.10.
<GridView x:Name="gvMain" Grid.Row="1" Padding="116,37,40,46"
ItemsSource="{Binding Source={StaticResource cvsMain}}">
...
<GridView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Grid Margin="1,0,0,6">
<Button
Style="{StaticResource TextPrimaryButtonStyle}" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding GroupName}"
Margin="3,-7,10,10"
Style="{StaticResource GroupHeaderTextStyle}" />
<TextBlock Text="{StaticResource ChevronGlyph}"
FontFamily="Segoe UI Symbol"
Margin="0,-7,0,10"
Style="{StaticResource GroupHeaderTextStyle}"/>
</StackPanel>
</Button>
</Grid>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</GridView.GroupStyle>
</GridView>
. , , , (. 8.5).
-, .
. -, .
,
107
(GroupStyle.Panel). VariableSizedWrapGrid.
, ,
GridView ( 8.11). ,
( ),
80 (Margin="0,0,80,0").
. 8.5.
8.11.
<GridView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
...
</DataTemplate>
</GroupStyle.HeaderTemplate>
108
<GroupStyle.Panel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid Orientation="Vertical"
Margin="0,0,80,0"
ItemWidth="160" ItemHeight="160"/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</GridView.GroupStyle>
VariableSizedWrapGrid (),
160160 (ItemWidth="160" ItemHeight="160").
,
(. 8.5). ,
.
(
GridView). , , ,
, . VirtualizingStackPanel ,
( ) ( 8.12).
,
.
VariableSizedWrapGrid.
8.12. GridView
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
. , (. 8.6).
VirtualizingStackPanel
(. 8.7).
. 8.7 , , . , , , ,
.
. 8.6.
. 8.7.
GridView
109
110
GridView
, GridView VariableSizedWrapGrid ( , ). 160160 .
,
320 .
Person HorizontalSize VerticalSize
, ( 8.13). , .
8.13. HorizontalSize VerticalSize
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
private int _horizontalSize = 1;
public int HorizontalSize
{
get { return _horizontalSize; }
set { _horizontalSize = value; }
}
private int _verticalSize = 1;
public int VerticalSize
{
get { return _verticalSize; }
set { _verticalSize = value; }
}
}
Person
( 8.14).
8.14. Person
developers.Persons.Add(new Person { LastName = "",
FirstName = "", Age = 31, HorizontalSize = 2, VerticalSize = 2 });
...
designers.Persons.Add(new Person { LastName = "",
FirstName = "", Age = 24, HorizontalSize = 2, VerticalSize = 1 });
111
.
GridView
, GridView.
PrepareContainerForItemOverride,
( ). VariableGridView ( 8.15).
8.15. VariableGridView
public class VariableGridView : GridView
{
protected override void PrepareContainerForItemOverride(
DependencyObject element, object item)
{
var personItem = item as Person;
if (personItem != null)
{
element.SetValue(VariableSizedWrapGrid.ColumnSpanProperty,
personItem.HorizontalSize);
element.SetValue(VariableSizedWrapGrid.RowSpanProperty,
personItem.VerticalSize);
}
base.PrepareContainerForItemOverride(element, item);
}
}
VariableSizedWrapGrid.ColumnSpanProperty
VariableSizedWrapGrid.RowSpanProperty , Person.
GridView
MainPage.xaml VariableGridView ( 8.16).
8.16. GridView VariableGridView
<Page
x:Class="ControlsApp.MainPage"
...
112
8
xmlns:local="using:ControlsApp"
...
>
<Page.Resources>
...
</Page.Resources>
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="140"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="Controls App" Margin="120,0,30,40"
Style="{StaticResource PageHeaderTextStyle}"/>
<local:VariableGridView x:Name="gvMain"
Grid.Row="1" Padding="116,37,40,46"
ItemsSource="{Binding Source={StaticResource cvsMain}}">
...
</local:VariableGridView>
</Grid>
</Page>
(. 8.8).
. 8.8. GridView
113
,
. ,
25601440 -
(. 8.9).
. 8.9. 25601440
.
( ).
VariableSizedWrapGrid
MaximumRowsOrColumns ( 8.17).
8.17. MaximumRowsOrColumns
<GroupStyle.Panel>
<ItemsPanelTemplate>
114
GridView
GridView
Person. GridView , - . . , - ,
, ( ).
, .
. ,
DataTemplateSelector, .
, . , ClassA ClassB,
. . 8.18.
8.18.
public class SampleTemplateSelector : DataTemplateSelector
{
protected override DataTemplate SelectTemplateCore(object item,
DependencyObject container)
{
if (item == null) return null;
if (item is ClassA)
{
return (DataTemplate)Application.Current.Resources[
"classATemplate"];
}
if (item is ClassB)
{
return (DataTemplate)Application.Current.Resources[
"classBTemplate"];
}
115
return (DataTemplate)Application.Current.Resources[
"basicTemplate"];
}
}
SampleTemplateSelector, GridView ( 8.19).
8.19. SampleTemplateSelector
<Page
x:Class="ControlsApp.MainPage"
...
xmlns:local="using:ControlsApp"
...
>
<Page.Resources>
...
<local:SampleTemplateSelector x:Key="templateSelector"/>
</Page.Resources>
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">
...
<GridView
ItemTemplateSelector="{StaticResource templateSelector}">
</GridView>
...
</Grid>
</Page>
(Semantic Zoom)
(Semantic Zoom) ,
Windows 8, Windows Store.
:
116
();
(); , -
.
( ,
), <Ctrl>, <+> <> <Ctrl>. ,
.
, ISemanticZoomInformation. , GridView
ListView .
(. 8.10).
. 8.10.
( ) .
(
Windows-), . , (. 8.11).
.
, .
117
. 8.11.
, .
SemanticZoom, ZoomedInView ZoomedInView ( 8.20).
8.20. SemanticZoom
<SemanticZoom>
<SemanticZoom.ZoomedInView>
<!-- -->
</SemanticZoom.ZoomedInView>
<SemanticZoom.ZoomedOutView>
<!-- -->
</SemanticZoom.ZoomedOutView>
</SemanticZoom>
GridView .
GridView
. GridView
gvZoomedOut ( 8.21), . .
.
118
8.21.
<SemanticZoom x:Name="semanticZoom" Grid.Row="1">
<SemanticZoom.ZoomedInView>
<local:VariableGridView x:Name="gvMain" Padding="116,37,40,46"
ItemsSource="{Binding Source={StaticResource cvsMain}}">
...
</local:VariableGridView >
</SemanticZoom.ZoomedInView>
<SemanticZoom.ZoomedOutView>
<GridView x:Name="gvZoomedOut" SelectionMode="None"
Padding="116,37,40,46">
<GridView.ItemTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Group.GroupName}"
Style="{StaticResource GroupHeaderTextStyle}"/>
</DataTemplate>
</GridView.ItemTemplate>
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<WrapGrid ItemWidth="200" ItemHeight="200"
MaximumRowsOrColumns="1"
VerticalChildrenAlignment="Center" />
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem">
<Setter Property="Margin" Value="4" />
<Setter Property="Padding" Value="10" />
<Setter Property="BorderBrush" Value="Gray" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="HorizontalContentAlignment"
Value="Center" />
<Setter Property="VerticalContentAlignment"
Value="Center" />
</Style>
</GridView.ItemContainerStyle>
</GridView>
</SemanticZoom.ZoomedOutView>
</SemanticZoom>
GridView ( ).
CollectionViewSource cvsMain.
, .
MainPage gvZoomedOut ( 8.22).
119
8.22. gvZoomedOut
public MainPage()
{
this.InitializeComponent();
...
cvsMain.Source = _groups;
gvZoomedOut.ItemsSource = cvsMain.View.CollectionGroups;
}
, . . ""
(. 8.12).
. 8.12.
: , , ( <Ctrl>)
.
(. 8.13).
, .
, . . .
, , , .
. -
. .
120
. 8.13.
ListView
ListView , GridView.
ListView, ,
GridView. :
( 8.23).
8.23. ListView
<ListView x:Name="lvMain" Grid.Row="1"
Margin="0,-10,0,0" Padding="10,0,0,60" Width="320"
ItemsSource="{Binding Source={StaticResource cvsMain}}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Margin="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Background="{StaticResource
ListViewItemPlaceholderBackgroundThemeBrush}"
Width="60" Height="60">
<Image Source="/Assets/Avatar.png"
Stretch="UniformToFill"/>
</Border>
121
ListView . 8.14.
ListView GridView. SelectionMode,
. 8.1.
8.1. SelectionMode
None
Single
122
8
8.1 ()
Multiple
Extended
,
, , ,
<Shift>,
. 8.14.
ListView
123
FlipView
, , FlipView .
.
FlipView , GridView ListView ItemsControl,
. FlipView
, .
FlipView
- . FlipView -.
FlipView People.
, GridView ( 8.24).
8.24. FlipView
<FlipView ItemsSource="{Binding Source={StaticResource cvsMain}}" Grid.Row="1"
Width="250" Height="250">
<FlipView.ItemTemplate>
<!-- -->
</FlipView.ItemTemplate>
</FlipView>
FlipView
(. 8.15). . 8.15 .
FlipView . FlipView
.
. 8.15. FlipView
124
Taa9
1, Windows Store-
( . 9.1):
(Full Screen);
( c) (Snapped).
320 ;
(Filled).
,
1366768 . , Windows Store-
.
.
, , , .
. 9.1.
126
,
8.
, , . - ,
320 ,
. .
, GridView, ListView.
, .
GridView SemanticZoom ( 9.1). , 8.
9.1. MainPage.xaml
<Page
...
>
...
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="140"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="Controls App" Margin="120,0,30,40"
Style="{StaticResource PageHeaderTextStyle}"/>
<SemanticZoom x:Name="semanticZoom" Grid.Row="1">
<SemanticZoom.ZoomedInView>
<local:VariableGridView x:Name="gvMain"
Padding="116,37,40,46"
ItemsSource="{Binding Source={StaticResource cvsMain}}">
...
</local:VariableGridView >
</SemanticZoom.ZoomedInView>
<SemanticZoom.ZoomedOutView>
<GridView x:Name="gvZoomedOut"
SelectionMode="None" Padding="116,37,40,46">
...
</GridView>
</SemanticZoom.ZoomedOutView>
</SemanticZoom>
127
ListView , . . Visibility
Collapsed.
ListView lvMain SemanticZoom semanticZoom.
.
Value ApplicationView, :
Snapped
Filled
FullScreenLandscape
FullScreenPortrait
, ,
. ,
, 9.2.
9.2.
switch (ApplicationView.Value)
{
case ApplicationViewState.Snapped:
{
}
break;
case ApplicationViewState.Filled:
{
}
break;
case ApplicationViewState.FullScreenLandscape:
{
}
break;
case ApplicationViewState.FullScreenPortrait:
{
}
break;
}
128
. .
( Window.Current.SizeChanged). , , ,
. , .
( 9.3).
9.3.
public sealed partial class MainPage : Page
{
private ObservableCollection<PersonGroup> _groups;
public MainPage()
{
this.InitializeComponent();
...
Window.Current.SizeChanged += Current_SizeChanged;
}
void Current_SizeChanged(object sender,
WindowSizeChangedEventArgs e)
{
if (ApplicationView.Value == ApplicationViewState.Snapped)
{
semanticZoom.Visibility = Visibility.Collapsed;
lvMain.Visibility = Visibility.Visible;
}
else
{
semanticZoom.Visibility = Visibility.Visible;
lvMain.Visibility = Visibility.Collapsed;
}
}
}
. - (. 9.2).
(Bing
Weather), Filled.
Visual
Studio. Device.
View (. 9.3).
. 9.2.
129
130
. 9.3.
<ListView x:Name="itemListView"
... >
...
</ListView>
<Grid>
...
<Button x:Name="backButton" Click="GoBack"
IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}"
Style="{StaticResource BackButtonStyle}"/>
<TextBlock x:Name="pageTitle" Text="{StaticResource AppName}"
Grid.Column="1" IsHitTestVisible="false"
Style="{StaticResource PageHeaderTextStyle}"/>
</Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ApplicationViewStates">
<VisualState x:Name="FullScreenLandscape"/>
<VisualState x:Name="Filled"/>
<VisualState x:Name="FullScreenPortrait">
<Storyboard>
<ObjectAnimationUsingKeyFrames
Storyboard.TargetName="backButton"
Storyboard.TargetProperty="Style">
<DiscreteObjectKeyFrame KeyTime="0"
Value="{StaticResource PortraitBackButtonStyle}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames
Storyboard.TargetName="itemGridView"
Storyboard.TargetProperty="Padding">
<DiscreteObjectKeyFrame KeyTime="0"
Value="96,137,10,56"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Snapped">
<Storyboard>
<ObjectAnimationUsingKeyFrames
Storyboard.TargetName="backButton"
Storyboard.TargetProperty="Style">
<DiscreteObjectKeyFrame KeyTime="0"
Value="{StaticResource SnappedBackButtonStyle}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames
Storyboard.TargetName="pageTitle"
131
132
9
Storyboard.TargetProperty="Style">
<DiscreteObjectKeyFrame KeyTime="0"
Value="{StaticResource
SnappedPageHeaderTextStyle}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames
Storyboard.TargetName="itemListView"
Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0"
Value="Visible"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames
Storyboard.TargetName="itemGridView"
Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0"
Value="Collapsed"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</common:LayoutAwarePage>
Visual State
Manager (VSM, ). XAML-. ,
, VSM .
LayoutAwarePage
VSM , . VSM .
VSM , LayoutAwarePage,
VSM LayoutAwarePage.
LayoutAwarePage
VisualStateManager.GoToState.
Device Visual Studio .
, VSM ,
. (Storyboard),
. 9.5
.
133
9.5.
<VisualState x:Name="Snapped">
<Storyboard>
...
<ObjectAnimationUsingKeyFrames
Storyboard.TargetName="itemListView"
Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
</ObjectAnimationUsingKeyFrames>
...
</Storyboard>
</VisualState>
9.5 ListView
itemListView. Visibility,
Visible.
(
) , . . VSM ,
.
FullScreenPortrait ListView .
Visual State Manager
, ,
, , . Visual State Manager ,
.
,
(PPI, Pixels Per Inch ). , 27- 25601440.
10- , 1024768, .
25601440, 1024768, , ,
(PPI
, ).
Windows 8 Windows Store- , -
134
PPI. Windows ,
PPI
. . .
:
100% ;
140% 19201080 PPI 174;
180% 25601440 PPI 240.
, , - . , XAML, .
, . , .
, PNG
JPEG. .
. , . . .
.
. ,
:
logo.scale-100.png 100100;
logo.scale-140.png 210210;
logo.scale-180.png 270270.
XAML- ( 9.6).
9.6.
<Image Source="logo.png" Width="100" Height="100"/>
!
, logo.png.
. , , .
135
, . :
scale-100\logo.png;
scale-140\logo.png;
scale-180\logo.png.
. XAML- ,
, .
(Snapped) ,
. ,
, .
Visual State Manager (VSM). LayoutAwarePage
VSM.
, Windows Store- .
.
, .
Taa10
.
Windows Store-, , .
, , ,
.
Windows.
,
: , ,
.
, ,
, . ,
.
, Windows Store- ,
. Windows Store-
.
137
-. -.
, , - .
, , ,
. ,
(Suspended). , .
,
(Terminated). Windows Store- . 10.1.
. ,
4, .
, , . , ,
, . .
.
App.xaml.cs. OnLaunched,
OnSuspending ( 10.1). , 4.
10.1. App.xaml.cs
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
...
}
138
10
.
PreviousExecutionState args
. PreviousExecutionState:
NotRunning -
, (log off),
.
Running ,
, , , (Secondary tile).
Suspended -
.
Terminated -
. , Suspended,
Terminated.
ClosedByUser .
OnLaunched .
, , OnLaunched.
OnSearchActivated ( 10.2).
10.2. ""
protected override void OnSearchActivated(SearchActivatedEventArgs args) {
...
}
OnSearchActivated ,
, "-".
13.
, OnLaunched OnSearchActivated
. .
.
139
,
Windows Store- ( ),
,
, . , , /
, , , . . .
, , .
/
BackgroundDownloader,
BackgroundUploader. ()
, , (), .
HTTP HTTPS ( GET, POST)
() HTTP HTTPS (
POST) . .
, ,
.
Windows Store- Blank App
DownloadApp. MainPage.xaml
btnStartDownload tbDownloadProgress ( 10.3).
10.3. MainPage.xaml
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<Button x:Name="btnStartDownload" Content=" "
Margin="24" Height="42" Width="126"/>
<TextBlock x:Name="tbDownloadProgress" Margin="24"
TextWrapping="Wrap" Text=" "
Style="{StaticResource HeaderTextStyle}"/>
</StackPanel>
</Grid>
btnStartDownload. .
, ,
. . 10.3.
140
10
10.3.
StorageFile destinationFile = await
ApplicationData.Current.LocalFolder.CreateFileAsync("file.dat");
BackgroundDownloader
( DownloadOperation). ( 10.3).
, StartAsync. 10.4.
10.4.
public sealed partial class MainPage : Page
{
private CancellationTokenSource _cancellationTokenSource =
new CancellationTokenSource();
public MainPage()
{
this.InitializeComponent();
}
private async void btnStartDownload_Click(object sender,
RoutedEventArgs e)
{
try
{
//
Uri source = new Uri("http://www._.ru/file.dat");
StorageFile destinationFile = await
ApplicationData.Current.LocalFolder.CreateFileAsync("file.dat");
var downloader = new BackgroundDownloader();
DownloadOperation download = downloader.CreateDownload(source,
destinationFile);
var asyncOperation = download.StartAsync();
var task = asyncOperation.AsTask(
_cancellationTokenSource.Token,
new Progress<DownloadOperation>(DownloadProgress));
}
141
StartAsync .
, .
, ,
( 10.5).
10.5. Task
var task = asyncOperation.AsTask(
_cancellationTokenSource.Token,
new Progress<DownloadOperation>(DownloadProgress));
DownloadProgress.
.
, . .
.
AttachToProccesses,
, BackgroundDownloader.GetCurrentDownloadsAsync. .
10.6.
public MainPage()
{
this.InitializeComponent();
AttachToProcesses();
}
142
10
, .
Windows Store- .
, . , (, -) (, ). ( )
( ) .
(Assembly, DLL). ,
(, . .).
, ,
. , , . ,
WNS (Windows Push Notification Services
Windows). Push- , -
143
(
).
, (Lock Screen) .
,
(. 10.2).
. 10.2. ( Windows
http://blogs.msdn.com/b/b8/archive/2012/06/14/building-the-mail-app.aspx)
, ,
( ), , , .
. ,
. ,
(. 10.3).
, ,
, .
, (. 10.1).
. 10.1 , . ,
, ,
. . ,
144
10
, 2 15 . 15
.
(. 10.2).
. 10.3. ,
10.1.
15
10.2.
ControlChannelTrigger
, . , ,
, ,
TCP. ,
145
10.2 ()
MaintenanceTrigger
TimeTrigger
. TimeTrigger ,
.
MaintenanceTrigger ,
.
.
( 15 .), .
,
PushNotificationTrigger
, Push- Raw
( 11).
SystemEventTrigger
.
,
. 10.3 ,
SystemEventTrigger. , , , .
10.3. SystemEventTrigger
InternetAvailable
NetworkStateChange
. ,
Wi-Fi 3G
OnlineIdConnectedStateChange
ServicingComplete
LockScreenApplicationAdded
LockScreenApplicationRemoved
ControlChannelReset*
SessionConnected*
SmsReceived
TimeZoneChange
, ,
UserAway*
UserPresent*
. . , .
146
10
, . InternetAvailable.
. 10.4.
10.4.
InternetAvailable
InternetNotAvailable
SessionConnected
SessionDisconnected
UserNotPresent
UserPresent
, . , IBackgroundTask.
Blank App TasksApp.
, (solution) Windows Runtime Component. Solution Explorer Solution TasksApp (1 project) Add | New
Project... Windows
Runtime Component TasksComponent.
Windows Store- .
References Add
Reference... TasksComponent.
Solution Explorer
. 10.4.
, , , .
TasksComponent ( 10.7).
10.7.
public sealed class SampleBackgroundTask : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
147
{
var deferral = taskInstance.GetDeferral();
try
{
//
}
finally
{
deferral.Complete();
}
}
}
. 10.4.
Solution Explorer
SampleBackgroundTask
. Package.appxmanifest
Declarations Background Tasks.
System Event, (Entry point) TasksComponent.SampleBackgroundTask (. 10.5).
. MainPage.xaml , .
BackgroundTaskBuilder. . , ( 10.8).
148
10
. 10.5.
10.8.
private void ButtonRegisterClick(object sender, RoutedEventArgs e)
{
var timerTrigger = new
SystemTrigger(SystemTriggerType.TimeZoneChange, false);
var builder = new BackgroundTaskBuilder();
builder.Name = "SampleBackgroundTask";
builder.TaskEntryPoint = "TasksComponent.SampleBackgroundTask";
builder.SetTrigger(timerTrigger);
BackgroundTaskRegistration task = builder.Register();
}
SystemTrigger ,
. (TimeZoneChange).
149
BackgroundTaskBuilder , ( 10.9).
10.9.
private void ButtonRegisterClick(object sender, RoutedEventArgs e)
{
var timerTrigger = new
SystemTrigger(SystemTriggerType.TimeZoneChange, false);
var builder = new BackgroundTaskBuilder();
builder.Name = "SampleBackgroundTask";
builder.TaskEntryPoint = "TasksComponent.SampleBackgroundTask";
builder.SetTrigger(timerTrigger);
IBackgroundCondition condition = new
SystemCondition(SystemConditionType.InternetAvailable);
builder.AddCondition(condition);
BackgroundTaskRegistration task = builder.Register();
}
Completed BackgroundTaskRegistration .
,
( 10.10).
10.10.
private void ButtonUnRegisterClick(object sender, RoutedEventArgs e)
{
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
task.Value.Unregister(true);
}
}
, ,
. . . , Visual Studio
Debug Location (. 10.6). ,
(Suspend),
(Resume), (Suspend
150
10
and shutdown),
SampleBackgroundTask.
Debug Location , VIEW |
Toolbars | Debug Location.
Taa11
? ,
, - -
. , , .
.
(Toast Notification).
(Tiles) .
, (Push).
,
Push-. 12.
.
. : , , - .
:
7
.
25 .
152
11
.
.
, (. 11.1).
11.1.
ToastImageAndText01
ToastImageAndText02
ToastImageAndText03
ToastImageAndText04
ToastText01
ToastText02
ToastText03
ToastText04
, , . 11.1.
153
. 11.1.
154
11
. 11.2.
11.2.
var xml = @"<toast>
<visual>
<binding template=""ToastText01"">
<text id=""1""> </text>
</binding>
</visual>
</toast>";
155
, , . .
.
, 10
( 11.3).
11.3.
var xml = @"<toast>
<visual>
<binding template=""ToastText01"">
<text id=""1""> </text>
</binding>
</visual>
</toast>";
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
var toast = new ScheduledToastNotification(xmlDocument,
DateTimeOffset.Now.AddSeconds(10));
ToastNotifier notifier = ToastNotificationManager.CreateToastNotifier();
notifier.AddToSchedule(toast);
.
,
, , , . .
( ), . ,
, , (Push-). , (, , ). .
Push-
Push- (Push Notification)
( ). "" (push) ,
(, pull) . Windows-
156
11
. Windows Store-, ,
, . Push-
.
. Push- .
, . Push- Windows (WNS, Windows Push Notification Services).
( ) WNS, ,
,
.
Push- Windows Store-
,
. ,
, WNS . WNS
.
Push-:
Toast . ,
;
Tile Badge , .
12;
Raw . Raw , "" , . Raw- ,
.
Raw- , , Raw, , .
WNS-.
Windows Store
WNS, ,
.
Windows Store, . ,
.
157
MSDN :
http://msdn.microsoft.com/ru-ru/library/windows/apps/hh465407.aspx
, "" , Windows Store, ,
, Windows Store.
""
Windows Store.
Store | Associate with the Store Visual Studio Express
Project | Store | Associate with the Store Visual Studio.
, :
SID (Package Security Identifier / )
ms-app://s-1-15-2-347940726-2465832990-910876698-369105280-2399447978997722633-4228783870.
Client secret / ( 1)
-a0o4J2-drcAxBUKeBA7cT06orFATHJw.
. ,
Push- .
Windows Store- .
,
, . .
- . , ,
. WNS
, .
, ,
.
Push-
Windows Store , Push-.
Push- .
, . Windows Store- URI, ( ) .
PushNotificationChannelManager ( 11.4).
158
11
11.4. URI
PushNotificationChannel channel = await
PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync
();
var uri = channel.Uri;
URI:
https://db3.notify.windows.com/?token=AgUAAAC0wm%2frjhZ0ciivfeaM%2bn0c2vh8%2fuJ
2NFN6PdwAzkv8KkWrwDvw7qEix%2fzkZsvbQJYt5mR45K7MP2ExP%2fSF4WF8zUuuzlDH6UYoMnwj2A
KA4wadN%2bc9qGUEBYvBcVO4Qt0%3d
URI .
.
URI
Push-, .
.
, C#.
. , , , ASP.NET MVC, PHP,
Python, Ruby, Java, node.js . .
, ,
XML-. 11.5.
PushNotificationChannel,
11.5.
static void Main(string[] args)
{
var secret = "-a0o4J2-drcAxBUKeBA7cT06orFATHJw";
var sid = "ms-app://s-1-15-2-347940726-2465832990-...";
var url = "https://db3.notify.windows.com/?token=...";
var xml = @"<toast>
<visual>
<binding template=""ToastText01"">
<text id=""1"">Push-</text>
</binding>
</visual>
</toast>";
var status = PostToWns(secret, sid, url, xml, "wns/toast");
Console.WriteLine(status);
}
159
System.Runtime.Serialization.dll.
WNS- ( 11.7).
11.7. WNS-
private static string PostToWns(string secret, string sid,
string uri, string xml, string type)
{
try
{
var accessToken = GetAccessToken(secret, sid);
var contentInBytes = Encoding.UTF8.GetBytes(xml);
var request = WebRequest.Create(uri) as HttpWebRequest;
request.Method = "POST";
request.Headers.Add("X-WNS-Type", type);
request.Headers.Add("Authorization",
String.Format("Bearer {0}", accessToken.AccessToken));
160
11
using (var requestStream = request.GetRequestStream())
{
requestStream.Write(contentInBytes, 0,
contentInBytes.Length);
}
using (var webResponse = (HttpWebResponse)request.GetResponse())
{
return webResponse.StatusCode.ToString();
}
}
catch (WebException webException)
{
var exceptionDetails =
webException.Response.Headers["WWW-Authenticate"];
if (exceptionDetails.Contains("Token expired"))
{
GetAccessToken(secret, sid);
return PostToWns(uri, xml, secret, sid, type);
}
return "EXCEPTION: " + webException.Message;
}
catch (Exception ex)
{
return "EXCEPTION: " + ex.Message;
}
}
private static OAuthToken GetAccessToken(string secret, string sid)
{
var urlEncodedSecret = HttpUtility.UrlEncode(secret);
var urlEncodedSid = HttpUtility.UrlEncode(sid);
var body = String.Format(
"grant_type=client_credentials&client_id={0}&client_secret={1}&scope=notify.win
dows.com", urlEncodedSid, urlEncodedSecret);
string response;
using (var client = new WebClient())
{
client.Headers.Add("Content-Type",
"application/x-www-form-urlencoded");
response = client.UploadString(
"https://login.live.com/accesstoken.srf", body);
}
return GetOAuthTokenFromJson(response);
}
161
System.Web.dll. WNS , . .
.
, . , XML-,
, .
PostToWns:
wns/toast ;
wns/badge ;
wns/tile ;
wns/raw Raw-.
.
.
.
, . ,
.
Windows Store-, ,
( ""). WNS. WNS
, .
Taa12
""
, Windows 8 .
, (Tiles) . "" (Live Tile)
.
, (Secondary Tiles), , . , , , "" "", .
. ,
, , .
Windows 8 : 150150
(Square) 310150 (Wide) (. 12.1).
Windows Store-
(Package.appxmanifes) Tile
. ,
310150 . .
""
163
. 12.1.
( , ), ,
, , (. 12.2).
#464646.
. 12.2.
""
, Windows 8 "" ,
.
46 . MSDN. 10 36 .
, ,
. , ( ). ,
.
164
12
. 12.3.
. 12.4.
""
165
. 12.3,
. 12.4.
. 12.1 12.2 .
, .
, , .
12.1.
TileSquareBlock,
TileSquareText01,
TileSquareText02,
TileSquareText03,
TileSquareText04,
TileSquareImage
(/)
TileSquarePeekImageAndText01
TileSquarePeekImageAndText02
TileSquarePeekImageAndText03
TileSquarePeekImageAndText04
12.2.
TileWideBlockAndText01
TileWideBlockAndText02
TileWideText01
TileWideText02
TileWideText03
TileWideText04
TileWideText05
TileWideText06
TileWideText07
TileWideText08
TileWideText09
TileWideText10
TileWideText11
TileWideImage
TileWideImageCollection
TileWideImageAndText01
TileWideImageAndText02
TileWideSmallImageAndText01
TileWideSmallImageAndText02
TileWideSmallImageAndText03
TileWideSmallImageAndText04
TileWideSmallImageAndText05
()
TileWidePeekImageCollection01
TileWidePeekImageCollection02
TileWidePeekImageCollection03
TileWidePeekImageCollection04
TileWidePeekImageCollection05
TileWidePeekImageCollection06
TileWidePeekImageAndText01
TileWidePeekImageAndText02
TileWidePeekImage01
TileWidePeekImage02
TileWidePeekImage03
TileWidePeekImage04
TileWidePeekImage05
TileWidePeekImage06
166
12
Windows Store- , . ,
, .
.
, , , .
XML-, , . ,
TileSquareBlock XML- 12.1.
12.1. XML- TileSquareBlock
<tile>
<visual>
<binding template="TileSquareBlock">
<text id="1">Text Field 1</text>
<text id="2">Text Field 2</text>
</binding>
</visual>
</tile>
TileSquareBlock . ( 12.2).
12.2.
<tile>
<visual>
<binding template="TileSquareBlock">
<text id="1">25</text>
<text id="2"></text>
</binding>
</visual>
</tile>
XML- () . XML-
TileNotification.
TileUpdater ( 12.3).
""
167
12.3.
var xml = @"<tile>
<visual>
<binding template=""TileSquareBlock"">
<text id=""1"">25</text>
<text id=""2""></text>
</binding>
</visual>
</tile>";
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
var notification = new TileNotification(xmlDocument);
TileUpdater updateManager =
TileUpdateManager.CreateTileUpdaterForApplication();
updateManager.Update(notification);
(. 11) . , , , XML-.
. 12.5.
,
( SmallLogo.png).
. 12.5.
168
12
XML- .
, - . XML TileUpdateManager. XML-
TileSquareBlock ( 12.4).
12.4. XML- TileSquareBlock
var xmlDocument =
TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquareBlock);
var nodes = xmlDocument.GetElementsByTagName("binding").First().ChildNodes;
nodes[0].InnerText = "30";
nodes[1].InnerText = "";
var notification = new TileNotification(xmlDocument);
var updateManager = TileUpdateManager.CreateTileUpdaterForApplication();
updateManager.Update(notification);
: , .
MSDN NotificationsExtensions, . :
http://code.msdn.microsoft.com/windowsapps/app-tiles-and-badges-sample5fc49148
, XML-. NotificationsExtensions 12.5.
12.5. NotificationsExtensions
ITileSquareBlock tileContent = TileContentFactory.CreateTileSquareBlock();
tileContent.TextBlock.Text = "35";
tileContent.TextSubBlock.Text = "";
TileUpdateManager.CreateTileUpdaterForApplication().
Update(tileContent.CreateNotification());
XML- , . .
.
""
169
.
.
.
, ,
. XML- ( 12.6). TileWideText03.
12.6. XML-
<tile>
<visual>
<binding template="TileSquareBlock">
<text id="1">10</text>
<text id="2"></text>
</binding>
<binding template="TileWideText03">
<text id="1">10 </text>
</binding>
</visual>
</tile>
,
12.3. . 12.6.
. 12.6.
170
12
"" . ,
. TileWideImage TileSquareImage
( 12.7).
12.7.
<tile>
<visual>
<binding template="TileSquareImage">
<image id="1" src="Assets\SmallLogo.png" alt="alt text"/>
</binding>
<binding template="TileWideImage">
<image id="1" src="Assets\WideLogo.png" alt="alt text"/>
</binding>
</visual>
</tile>
12.7
Windows Store-.
( 12.8).
12.8.
<tile>
<visual>
<binding template="TileSquareImage">
<image id="1" alt="alt text"
src="ms-appx:///Assets/SquareTileLogo.png" />
</binding>
<binding template="TileWideImage">
<image id="1" alt="alt text"
src="ms-appx:///Assets/WideLogo.png" />
</binding>
</visual>
</tile>
,
ms-appdata:///local/. ,
HTTP-, .
""
171
, ,
. ,
.
, ( 12.9).
12.9.
var updateManager = TileUpdateManager.CreateTileUpdaterForApplication();
updateManager.Clear();
. "" 10 ( 12.10).
12.10.
var xml = @"<tile>
...
</tile>";
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
var notification = new TileNotification(xmlDocument);
notification.ExpirationTime = DateTimeOffset.Now.AddSeconds(10);
var updateManager = TileUpdateManager.CreateTileUpdaterForApplication();
updateManager.Update(notification);
, 12.10, ,
"" 10 . Windows 8 ,
. , - ,
, , , , , . . .
, 10 ,
12.11.
12.11.
var xml = @"<tile>
...
</tile>";
172
12
Windows 8 , ,
.
EnableNotificationQueue TileUpdater
( 12.2).
12.12.
var updateManager = TileUpdateManager.CreateTileUpdaterForApplication();
updateManager.EnableNotificationQueue(true);
,
( 12.13).
12.13.
var updateManager = TileUpdateManager.CreateTileUpdaterForApplication();
updateManager.Clear();
updateManager.EnableNotificationQueue(true);
for (int i = 1; i <= 5; i++)
{
var xml = @"<tile>
<visual>
<binding template=""TileSquareBlock"">
<text id=""1"">{0}</text>
<text id=""2""></text>
</binding>
""
173
<binding template=""TileWideText03"">
<text id=""1"">{0} </text>
</binding>
</visual>
</tile>";
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(String.Format(xml, i * 10));
var notification = new TileNotification(xmlDocument);
updateManager.Update(notification);
}
, . updateManager.Clear ,
,
.
,
,
.
( ). 1
99 (, ), 100,
"99+" (, ).
BadgeUpdateManager,
TileUpdateManager .
. , , XML-. 12.14 42 (. 12.7).
. 12.7.
174
12
12.14.
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(@"<badge value=""42""/>");
var badgeNotification = new BadgeNotification(xmlDocument);
var updateManager = BadgeUpdateManager.CreateBadgeUpdaterForApplication();
updateManager.Update(badgeNotification);
42 , "" .
, XML-
42 . , attention
( 12.15).
12.15.
xmlDocument.LoadXml(@"<badge value=""attention""/>"));
. 12.8.
. 12.8.
. 12.3.
12.3.
XML-
activity
<badge value="activity"/>
alert
<badge value="alert"/>
available
<badge value="available"/>
away
<badge value="away"/>
""
175
12.3 ()
XML-
busy
<badge value="busy"/>
newMessage
<badge value="newMessage"/>
paused
<badge value="paused"/>
playing
<badge value="playing"/>
unavailable
<badge value="unavailable"/>
error
<badge value="error"/>
attention
<badge value="attention"/>
. - "".
, . , . .
. , .
. :
Push-;
.
Push-, 11, , , . . . ,
, Push, .
, , , . XML-
176
12
, . , , .
Push- .
, . . . Push- .
XML- , . ,
, , .
, XML- 12.6 :
http://foo.ru/TileHandler.ashx.
, ( ), ( 12.16).
12.16.
var updateManager = TileUpdateManager.CreateTileUpdaterForApplication();
updateManager.StartPeriodicUpdate(new Uri("http://foo.ru/TileHandler.ashx"),
PeriodicUpdateRecurrence.HalfHour);
, , ,
.
. ( 12.17).
12.17. ,
var updateManager = TileUpdateManager.CreateTileUpdaterForApplication();
updateManager.EnableNotificationQueue(true);
Uri[] uriCollection = new[]
{
new Uri("http://foo.ru/TileHandler1.ashx"),
new Uri("http://foo.ru/TileHandler2.ashx"),
new Uri("http://foo.ru/TileHandler3.ashx"),
new Uri("http://foo.ru/TileHandler4.ashx"),
new Uri("http://foo.ru/TileHandler5.ashx"),
};
updateManager.StartPeriodicUpdateBatch(uriCollection,
PeriodicUpdateRecurrence.HalfHour);
""
177
. 12.18 XML- .
12.18.
var updateManager = BadgeUpdateManager.CreateBadgeUpdaterForApplication();
updateManager.StartPeriodicUpdate(new
Uri("http://foo.ru/TileBadgeHandler.ashx"), PeriodicUpdateRecurrence.HalfHour);
(Secondary Tiles) Windows Store . ,
,
.
() . ,
, .
( 12.19).
12.19.
private async void Button_Click(object sender, RoutedEventArgs e)
{
SecondaryTile secondaryTile = new SecondaryTile()
{
TileId = "12345",
ShortName = " ",
DisplayName = " ",
Arguments = "67890",
TileOptions = TileOptions.ShowNameOnLogo |
TileOptions.ShowNameOnWideLogo,
Logo = new Uri("ms-appx:///assets/SmallLogo.png"),
WideLogo = new Uri("ms-appx:///assets/WideLogo.png"),
};
bool isPinned = await secondaryTile.RequestCreateAsync();
}
SecondaryTile, ,
.
()
(. 12.9), . .
178
12
. 12.9.
TileId , (, , . .).
App. .
,
. OnLaunched ( App.xaml.cs) args TileId , .
, TileId,
12345, ( 12.20).
12.20. ,
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
...
}
var tileId = args.TileId;
if (tileId == "12345")
{
var secondaryTileArgument = args.Arguments;
""
179
rootFrame.Navigate(typeof(SecondaryTilePage),
secondaryTileArgument);
}
else if (rootFrame.Content == null)
{
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
Window.Current.Activate();
}
!
,
, ,
.
12.20 :
, , .
, , "". TileUpdater,
CreateTileUpdaterForSecondaryTile TileUpdateManager TileId ( 12.21).
12.21.
var updateManager =
TileUpdateManager.CreateTileUpdaterForSecondaryTile("TileId");
updateManager.Update(notification);
. Windows Store-, .
, , ,
, .
, .
, .
Taa13
""
Windows Store Windows 8 , .
"-". , , ,
. ,
- , .
.
. , ,
"San Francisco" Travel (),
. Maps (),
- , Weather ()
.
Windows Store-,
(Suggestions),
, ,
.
, Windows Store-
. , , "" ,
.
.
, , ,
(. 13.1).
""
181
. 13.1.
, , .
. , (""), , .
"-".
. , .
.
,
.
Windows Store-. Windows- " ( ), ".
Windows XP Windows Vista Microsoft
, UAC (User Account Control ).
, UAC .
182
13
, " , ". ,
, . UAC , .
, Windows Store-,
" , ".
, ,
.
Windows Store- .
""
""
. Blank App SearchApp.
"-" , , . ,
, .
.
( Package.appxmanifest)
Declarations. Available Declarations Search
Add (. 13.2).
, .
.
OnSearchActivated ( App.xaml.cs).
, .
SearchPage.xaml, Basic Page.
App.xaml.cs OnSearchActivated ( 13.1).
13.1. OnSearchActivated
sealed partial class App : Application
{
public App()
{
...
}
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Frame rootFrame = Window.Current.Content as Frame;
""
if (rootFrame == null)
{
rootFrame = new Frame();
if (args.PreviousExecutionState ==
ApplicationExecutionState.Terminated)
{
...
}
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
Window.Current.Activate();
}
private void OnSuspending(object sender, SuspendingEventArgs e)
{
...
}
protected override void OnSearchActivated(
SearchActivatedEventArgs args)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
rootFrame = new Frame();
Window.Current.Content = rootFrame;
}
rootFrame.Navigate(typeof(SearchPage), args.QueryText);
Window.Current.Activate();
}
}
183
184
13
. 13.2.
OnSearchActivated ( <Enter>).
, SearchPage.xaml .
, , OnLaunched
. ,
OnSearchActivated OnLaunched.
, . , .
C#- SearchPage.xaml
, OnNavigatedTo. , ( 13.2).
13.2. OnNavigatedTo
public sealed partial class SearchPage : LayoutAwarePage
{
public SearchPage()
""
185
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
var queryText = (string)e.Parameter;
pageTitle.Text = String.Format(" \"{0}\"",
queryText);
base.OnNavigatedTo(e);
}
}
(. 13.3) ( ).
. 13.3.
, .
. ,
, . OnSearchActivated,
186
13
. ,
.
,
, . .
OnLaunched ( ). ,
.
. SearchPage.xaml
( 13.3).
13.3. SearchPage.xaml
<Page.BottomAppBar>
<AppBar>
<Button Style="{StaticResource HomeAppBarButtonStyle}"/>
</AppBar>
</Page.BottomAppBar>
HomeAppBarButtonStyle
StandardStyles.xaml. ( 13.4).
13.4.
private void Button_Click(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(MainPage));
}
! .
Search Contract,
OnSearchActivated .
, .
, . ,
.
, .
.
""
187
, SearchPage.xaml . MainPage.xaml,
SearchPage.xaml
(
).
? ,
(, -
188
13
), , .
,
, .
SuggestionsRequested SearchPane ( 13.6).
13.6.
protected override void OnNavigatedTo(NavigationEventArgs e)
{
...
var currentPane = SearchPane.GetForCurrentView();
currentPane.QueryChanged += currentPane_QueryChanged;
currentPane.SuggestionsRequested += currentPane_SuggestionsRequested;
base.OnNavigatedTo(e);
}
, ,
(. 13.4).
!
SearchPage.xaml.
""
189
. 13.4.
GetDefferral, deferral.Complete.
,
.
. , .
defferral, , - ,
deferral.Complete. .
,
, . ,
,
.
. , . ,
.
: App.xaml.cs Subscribe Unsubscribe ( 13.7) .
190
13
13.7.
public void Subscribe()
{
var currentPane = SearchPane.GetForCurrentView();
currentPane.SuggestionsRequested += currentPane_SuggestionsRequested;
}
public void Unsubscribe()
{
var currentPane = SearchPane.GetForCurrentView();
currentPane.SuggestionsRequested -= currentPane_SuggestionsRequested;
}
void currentPane_SuggestionsRequested(SearchPane sender,
SearchPaneSuggestionsRequestedEventArgs args)
{
var defferal = args.Request.GetDeferral();
for (int i = 0; i < 5; i++)
{
args.Request.SearchSuggestionCollection.AppendQuerySuggestion(
String.Format("#{0}. {1}", i, args.QueryText));
}
defferal.Complete();
}
Subscribe OnLaunched
OnSearchActivated, Unsubscribe OnSuspending ( 13.8).
13.8.
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Subscribe();
// OnLaunched
}
protected override void OnSearchActivated(SearchActivatedEventArgs args)
{
Subscribe();
// OnSearchActivated
}
""
191
, , , , .
. ,
.
,
, , , ,
. , SuggestionsRequested ( 13.9).
13.9.
void currentPane_SuggestionsRequested(SearchPane sender,
SearchPaneSuggestionsRequestedEventArgs args)
{
var defferal = args.Request.GetDeferral();
for (int i = 0; i < 2; i++)
{
args.Request.SearchSuggestionCollection.AppendQuerySuggestion(
String.Format("#{0}. {1}", i, args.QueryText));
}
for (int i = 0; i < 2; i++)
{
var image = RandomAccessStreamReference.CreateFromUri(
new Uri("ms-appx:///Assets/SmallLogo.png"));
args.Request.SearchSuggestionCollection.AppendResultSuggestion(
" ", "", "Id", image,
" ");
}
defferal.Complete();
}
. 13.5.
192
13
. 13.5.
, .
ResultSuggestionChosen SearchPane ( 13.10).
13.10.
public void Subscribe()
{
var currentPane = SearchPane.GetForCurrentView();
currentPane.SuggestionsRequested += currentPane_SuggestionsRequested;
currentPane.ResultSuggestionChosen += currentPane_ResultSuggestionChosen;
}
void currentPane_ResultSuggestionChosen(SearchPane sender,
SearchPaneResultSuggestionChosenEventArgs args)
{
var id = args.Tag;
}
Tag, . AppendResultSuggestion.
""
193
.
. , .
. .
, , , .
Taa14
" "
(Share) Windows Store-.
"-". ,
, .
/. , , , , ,
, , , .
. , , , "-". , , (. 14.1).
, (. 14.2).
.
,
, .
,
, , . , , , .
. , .
,
"" . .
- SDK (Software Development Kit)
" "
195
. 14.1.
. 14.2.
196
14
( ), Windows-. , ,
( , ,
).
.
Blank App ShareApp.
MainPage.xaml
txtMain, ( 14.1).
14.1. MainPage.xaml
<Page
...
>
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<TextBox x:Name="txtMain" AcceptsReturn="True"
Width="450" Height="250"
ScrollViewer.VerticalScrollBarVisibility="Visible"/>
</Grid>
</Page>
DataTransferManager.
"-", , , DataRequested DataTransferManager.
MainPage,
( 14.2).
14.2. DataRequested
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
" "
197
,
. ,
. ,
.
, .
, , SetText
DataPackage ( Data args.Request.Data) ( 14.3).
14.3.
void currentManager_DataRequested(DataTransferManager sender,
DataRequestedEventArgs args)
{
if (String.IsNullOrWhiteSpace(txtMain.Text)) return;
var defferal = args.Request.GetDeferral();
args.Request.Data.Properties.Title = " ";
args.Request.Data.Properties.Description = " ";
args.Request.Data.SetText(txtMain.Text);
defferal.Complete();
}
, .
. 14.3 ,
"" .
198
14
. 14.3.
(. 14.1).
14.1.
SetUri
URI
SetRtf
RTF
SetHtmlFormat
HTML
HTML-
SetBitmap
Bitmap
SetStorageItems
StorageItems
SetData
SetDataProvider
. 14.1 - , . , .
Clipboard. 14.4.
" "
199
14.4.
var data = new DataPackage();
data.SetText(" ");
Clipboard.SetContent(data);
, . 14.1.
, .
, ,
.
Package.appxmanifest Declarations.
Available Declarations Share Target Add.
, . , Text (. 14.4),
. .
,
OnShareTargetActivated ( App.xaml.cs) ( 14.5). Blank Page TargetPage.xaml,
.
14.5. OnShareTargetActivated
sealed partial class App : Application
{
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
}
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
...
}
private void OnSuspending(object sender, SuspendingEventArgs e)
{
...
}
200
14
protected override void OnShareTargetActivated(
ShareTargetActivatedEventArgs args)
{
var frame = new Frame();
frame.Navigate(typeof(TargetPage), args.ShareOperation);
Window.Current.Content = frame;
Window.Current.Activate();
}
. 14.4.
OnShareTargetActivated TargetPage.xaml,
ShareOperation, .
, TargetPage.xaml
645 , "", .
" "
201
TargetPage.xaml ( 14.6).
14.6. TargetPage.xaml
<Page
...
>
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">
<TextBox x:Name="txtMain" AcceptsReturn="True"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
ScrollViewer.VerticalScrollBarVisibility="Visible"
FontSize="24" TextWrapping="Wrap"/>
</Grid>
</Page>
TargetPage.xaml
( 14.7).
14.7.
public sealed partial class TargetPage : Page
{
public TargetPage()
{
this.InitializeComponent();
}
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.Parameter == null) return;
var shareOperation = (ShareOperation)e.Parameter;
if (shareOpertaion.Data.Contains(StandardDataFormats.Text))
{
txtMain.Text = await shareOpertaion.Data.GetTextAsync();
}
}
}
(
) , ,
.
202
14
- , "-". , ,
. . TargetPage.xaml (. 14.5).
. 14.5.
, , . ( 14.8).
RandomAccessStreamReference.
14.8.
void currentManager_DataRequested(DataTransferManager sender,
DataRequestedEventArgs args)
{
var defferal = args.Request.GetDeferral();
args.Request.Data.Properties.Title = "";
args.Request.Data.Properties.Description = "";
" "
203
, , ( 14.9).
14.9. ,
var uri = new Uri("ms-appx:///Assets/Logo.png");
Bitmap. , Image imgMain.
( 14.10).
14.10.
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.Parameter == null) return;
var shareOperation = (ShareOperation)e.Parameter;
if (shareOpertaion.Data.Contains(StandardDataFormats.Bitmap))
{
var bitmapReference = await shareOpertaion.Data.GetBitmapAsync();
var bitmapImage = new BitmapImage();
bitmapImage.SetSource(await bitmapReference.OpenReadAsync());
img.Source = bitmapImage;
}
}
(Text, Bitmap, URI . .) . , - . , ( , , ,
. .), Text, -
204
14
, . , ,
, ,
, .
SetData, ,
"Product". SetData
, XML, JSON (JavaScript Object
Notation). JSON, . . , JavaScript, C#, Visual Basic C++.
, ( "Product"),
, JSON.
, ,
, , .
, - . , .
,
, http://schema.org.
, http://schema.org/Product, -,
Product, ,
-
!
( 14.11).
14.11.
void currentManager_DataRequested(DataTransferManager sender,
DataRequestedEventArgs args)
{
var defferal = args.Request.GetDeferral();
var dataPackage = args.Request.Data;
dataPackage.Properties.Title = " ";
var productFormat =
@"{
""type"" : ""http://schema.org/Product"",
""properties"" :
{
""name"" : ""{0}"",
""description"" : ""{1}"",
""productID"" : ""{2}""
}
}";
" "
205
-. , , http://
schema.org/Product.
JSON ( 14.12).
14.12. JSON
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.Parameter == null) return;
var dataPackageView = ((ShareOperation)e.Parameter).Data;
var productJson = await
dataPackageView.GetTextAsync("http://schema.org/Product");
JsonObject productObject = JsonObject.Parse(productJson);
JsonObject properties = productObject["properties"].GetObject();
var productId = properties["productID"];
var productName = properties["name"];
var productDescriptions = properties["description"];
}
, - , "" . -
206
14
. ,
.
, ,
, . "" .
, ,
( 14.13).
14.13.
void currentManager_DataRequested(DataTransferManager sender,
DataRequestedEventArgs args)
{
args.Request.Data.Properties.Title = "";
args.Request.Data.SetDataProvider("product", DataHandler);
}
private async void DataHandler(DataProviderRequest request)
{
var defferal = request.GetDeferral();
try
{
}
finally
{
defferal.Complete();
}
}
BinaryDataHandler .
( 1 10 000) ( 14.14).
14.14.
private async void BinaryDataHandler(DataProviderRequest request)
{
var defferal = request.GetDeferral();
try
{
var stream = new InMemoryRandomAccessStream();
" "
207
,
InMemoryRandomAccessStream.
.
, (,
, "" . .), .
ReportStarted ShareOperation. ReportDataRetreived. - . , ReportCompleted ( 14.15).
-.
14.15.
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.Parameter == null) return;
var shareOperation = (ShareOperation)e.Parameter;
shareOperation.ReportStarted();
208
14
//
shareOperation.ReportDataRetrieved();
//
shareOperation.ReportCompleted();
- , c ReportError ( 14.16).
14.16.
shareOperation.ReportError(" ");
,
, -,
( -).
.
, , .
, /. .
,
.
. .
Taa15
""
"-" (Settings).
.
Windows-
. Windows Store-
.
"-".
"-" ,
. , ( ),
. Bing Weather . 15.1.
, .
.
Blank App SettingsApp.
, App.xaml.cs.
SettingsPane. CommandsRequested .
Subscribe Unsubscribe
, ( 15.1). .
210
15
. 15.1.
15.1. CommandsRequested
sealed partial class App : Application
{
...
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
...
Subscribe();
Window.Current.Activate();
}
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
Unsubscribe();
deferral.Complete();
}
public void Subscribe()
{
var currentPane = SettingsPane.GetForCurrentView();
""
211
currentPane.CommandsRequested += currentPane_CommandsRequested;
}
public void Unsubscribe()
{
var currentPane = SettingsPane.GetForCurrentView();
currentPane.CommandsRequested -= currentPane_CommandsRequested;
}
void currentPane_CommandsRequested(SettingsPane sender,
SettingsPaneCommandsRequestedEventArgs args)
{
}
}
, Permissions (. 15.2).
.
SettingsCommand, args.Request.
ApplicationCommands ( 15.2).
15.2.
void currentPane_CommandsRequested(SettingsPane sender,
SettingsPaneCommandsRequestedEventArgs args)
{
var applicationCommands = args.Request.ApplicationCommands;
var newComand = new SettingsCommand("Id_", "", cmd =>
{
//
});
applicationCommands.Add(newComand);
var aboutCommand = new SettingsCommand("About", " ", cmd =>
{
Frame.Navigate(typeof(AboutPage));
});
applicationCommands.Add(aboutCommand);
var siteCommand = new SettingsCommand("Site", " ", cmd =>
{
Launcher.LaunchUriAsync(new Uri("http://techdays.ru"));
});
applicationCommands.Add(siteCommand);
}
212
15
,
, .
. 15.3.
. 15.2.
. 15.3.
, .
:
, , ,
.
""
213
,
.
, .
.
Basic Page, .
SettingsFlyout.xaml.
XAML- . MSDN:
http://code.msdn.microsoft.com/windowsapps/App-settings-sample-1f762f49.
,
.
Popup, ( 15.3).
.
15.3.
private Popup _settingsPopup;
void currentPane_CommandsRequested(SettingsPane sender,
SettingsPaneCommandsRequestedEventArgs args)
{
var applicationCommands = args.Request.ApplicationCommands;
var newComand = new SettingsCommand("Id_", "", cmd =>
{
_settingsPopup = new Popup();
_settingsPopup.IsLightDismissEnabled = true;
_settingsPopup.Width = 646;
_settingsPopup.Height = Window.Current.Bounds.Height;
_settingsPopup.ChildTransitions = new TransitionCollection();
_settingsPopup.ChildTransitions.Add(new PaneThemeTransition()
{
Edge = (SettingsPane.Edge == SettingsEdgeLocation.Right) ?
EdgeTransitionLocation.Right :
EdgeTransitionLocation.Left
});
SettingsFlyout mypane = new SettingsFlyout();
mypane.Width = 646;
mypane.Height = Window.Current.Bounds.Height;
214
15
_settingsPopup.Child = mypane;
_settingsPopup.SetValue(Canvas.LeftProperty,
SettingsPane.Edge == SettingsEdgeLocation.Right
? (Window.Current.Bounds.Width 646) : 0);
_settingsPopup.SetValue(Canvas.TopProperty, 0);
_settingsPopup.IsOpen = true;
});
applicationCommands.Add(newComand);
...
(. 15.4).
. 15.4.
""
215
!
,
"" "".
.
,
"-". ().
, , , .
. Popup
.
Taa16
Windows Store- ,
Windows-.
Windows Store-
, . . "" (Sandbox).
, , C:\ .
Windows Store-
, ( ). ,
(
17). , SQLite,
.
Windows Store- ( , ), . :
LocalFolder;
RoamingFolder;
TemporaryFolder.
.
:
LocalSettings;
RoamingSettings.
217
, . .
, LocalFolder, , . ,
, , SQLite , .
RoamingFolder , . , RoamingFolder . (RoamingSettings).
. ,
,
RoamingFolder , , .
(, ). RoamingFolder
, , . .
100 .
, RoamingFolder !
, RoamingFolder, .
.
RoamingStorageQuota ( 16.1).
16.1.
ApplicationData.Current.RoamingStorageQuota
, RoamingFolder RoamingSettings
.
. , -
RoamingFolder , .
TemporaryFolder . ,
.
.
218
16
(string, bool, int,
float . .) ,
LocalSettings RoamingSettings. ,
RoamingSettings .
( ,
. .).
LocalSettings. ( 16.2).
16.2. LocalSettings
ApplicationData.Current.LocalSettings.Values["MyKey"] = "";
, ( 16.3).
16.3. LocalSettings
var val = (string)ApplicationData.Current.LocalSettings.Values["MyKey"];
,
NullReferenceException (bool, int, float
. .) ( 16.4).
16.4.
var settings = ApplicationData.Current.LocalSettings;
if (settings.Values.ContainsKey("PageNumber"))
{
var number = (int)settings.Values["PageNumber"];
}
219
.
, (LocalFolder, RoamingFolder
TempraryFolder), .
, . ( 16.6).
16.6.
var folder = ApplicationData.Current.LocalFolder;
//var folder = ApplicationData.Current.RoamingFolder;
//var folder = ApplicationData.Current.TemporaryFolder;
16.6 .
FileIO. test.txt
"Hello World!" ( 16.7).
16.7.
var folder = ApplicationData.Current.LocalFolder;
var file = await folder.CreateFileAsync("test.txt",
CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(file, "Hello World!");
16.8.
16.8.
var storageFolder = ApplicationData.Current.LocalFolder;
var file = await storageFolder.GetFileAsync("test.txt");
var text = await FileIO.ReadTextAsync(file);
RoamingFolder.
, , , ,
, .
DataChanged ( 16.9).
16.9.
ApplicationData.Current.DataChanged += (sender, args) =>
{
//
};
220
16
, , . , , . , , .
( ) .
Windows 8 . , .
, . ApplicationData.Current.Version.
.
, 1.
SetVersionAsync ( 16.10).
16.10.
await ApplicationData.Current.SetVersionAsync(versionNumber,
UpgradeToVersionHandler);
versionNumber ,
Handler ( 16.11).
UpgradeToVersion-
16.11.
private void UpgradeToVersionHandler(SetVersionRequest setversionrequest)
{
var defferal = setversionrequest.GetDeferral();
if (setversionrequest.DesiredVersion >
setversionrequest.CurrentVersion)
{
// ;
}
defferal.Complete();
}
. , .
( ).
221
.
, , XAML-. Windows 8
:
ms-appx:/// , ;
ms-appdata:///local/ LocalFolder;
ms-appdata:///roaming/ RoamingFolder;
ms-appdata:///temp/ TemporaryFolder.
16.12 .
16.12.
LocalImage.Source = new BitmapImage(
new Uri("ms-appdata:///local/appDataLocal.png"));
RoamingImage.Source = new BitmapImage(
new Uri("ms-appdata:///roaming/appDataRoaming.png"));
TempImage.Source = new BitmapImage(
new Uri("ms-appdata:///temp/appDataTemp.png"));
Path
. ,
ApplicationData.Current.LocalFolder.Path:
C:\Users\<UserName>\AppData\Local\Packages\f7cb881e-53dd-47d9-b55957defb00a8fb_1ajdc8xvgt2ym\LocalState\
<UserName> , , f7cb881e53dd-47d9-b559-57defb00a8fb_1ajdc8xvgt2ym .
Windows Explorer,
.
SQLite
, , .
(). Windows 8
(). ,
. SQLite, , .
SQL.
222
16
. , SQLite
Windows Store-.
SQLite . Tools | Extensions and Updates SQLite for Windows Runtime (. 16.1).
223
. 16.2. SQLite
. 16.3.
224
16
.NET- ORM (Object-Relational Mapping), LINQ (Language Integrated Quiries). SQLite . sqlite-net.
Solution Explorer Manage
NuGet Packages..., sqlite-net (. 16.4).
. 16.4. sqlite-net
, .
16.13.
, .
16.13.
var dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "data.db");
using (var db = new SQLiteConnection(dbPath))
{
//
}
225
, . ,
, . ,
250 ( 16.14).
16.14.
public class Product
{
[PrimaryKey, AutoIncrement]
public int ProductId { get; set; }
[MaxLength(250)]
public string Name { get; set; }
}
.
Product ( 16.15).
16.15.
private void InitDb()
{
var dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path,
"data.db");
using (var db = new SQLiteConnection(dbPath))
{
db.CreateTable<Product>();
}
}
226
16
16.16.
using (var db = new SQLiteConnection(dbPath))
{
var product = new Product() { Name = "Visual Studio 2012" };
db.Insert(product);
}
, 16.16, ProductId
Product .
( 16.17).
16.17.
using (var db = new SQLiteConnection(dbPath))
{
var products = from c in db.Table<Product>()
where c.Name == "Visual Studio 2012"
select c;
}
, SQL-. , 2 ( 16.18).
227
16.18. SQL-
using (var db = new SQLiteConnection(dbPath))
{
var products = db.Query<Product>(
"SELECT * FROM Product WHERE ProductId=?", 2);
var product = products.FirstOrDefault();
}
( 16.19).
16.19.
using (var db = new SQLiteConnection(dbPath))
{
db.Delete<Product>(3);
}
LINQ, (, ) SQL-.
SQL-, ( 16.20).
16.20. SQL-
using (var db = new SQLiteConnection(dbPath))
{
var command = db.CreateCommand(
"INSERT INTO Product (Name) VALUES (?)", "Windows 8");
command.ExecuteNonQuery();
}
. 16.21 , Product.
16.21. ,
using (var db = new SQLiteConnection(dbPath))
{
var command = db.CreateCommand(
"SELECT COUNT(ProductId) FROM Product");
var count = command.ExecuteScalar<int>();
}
228
16
Windows 8 Windows .
Windows 8
. , ,
.
Windows Store- : LocalFolder, RoamingFolder TemporaryFolder,
, .
.
, , . SQLite.
Taa17
, , Windows Store .
. , , 16.
, .
, .
- ,
"", ,
.
.
FileOpenPicker
FileOpenPicker , , , OpenFileDialog Windows Forms. FileOpenPicker
. ,
.
FileOpenPicker 17.1.
17.1. FileOpenPicker
var openPicker = new FileOpenPicker();
openPicker.FileTypeFilter.Add("*");
var file = await openPicker.PickSingleFileAsync();
FileOpenPicker , . (-
230
17
, ,
), "*".
, ,
".jpg".
( 17.2).
17.2. FileOpenPicker
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".png");
var file = await openPicker.PickSingleFileAsync();
if(file!=null)
{
...
}
, . NULL.
PickMultipleFilesAsync ( 17.3).
17.3.
var openPicker = new FileOpenPicker();
openPicker.FileTypeFilter.Add("*");
var files = await openPicker.PickMultipleFilesAsync();
FileOpenPicker ,
. , , , ,
FileOpenPicker "" ( 17.4).
17.4.
openPicker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
, , "",
"" . .:
DocumentsLibrary;
ComputerFolder;
231
Desktop;
Downloads;
HomeGroup;
MusicLibrary;
PicturesLibrary;
VideosLibrary.
, , :
( ) ( 17.5).
17.5.
openPicker.ViewMode = PickerViewMode.Thumbnail;
. ,
, ""
( 17.6).
17.6.
openPicker.CommitButtonText = "";
, FileOpenPicker ,
17.7.
17.7. FileOpenPicker
var openPicker = new FileOpenPicker();
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".png");
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.CommitButtonText = "";
var file = await openPicker.PickSingleFileAsync();
if (file != null)
{
//
}
. 17.1.
232
17
. 17.1.
!
, ,
, SkyDrive. ,
, .
FileSavePicker
FileSavePicker, SaveFileDialog Windows Forms. FileSavePicker .
17.8.
17.8.
var savePicker = new FileSavePicker();
savePicker.FileTypeChoices.Add("", new List<string>() { ".txt" });
savePicker.SuggestedFileName = "hello";
var file = await savePicker.PickSaveFileAsync();
if (file != null)
{
CachedFileManager.DeferUpdates(file);
await FileIO.WriteTextAsync(file, "Hello World!");
CachedFileManager.CompleteUpdatesAsync(file);
}
233
, ,
NULL, NullReferenceException.
.
, ( SkyDrive).
,
CachedFileManager.
FolderPicker
, , . .
FolderPicker, FolderBrowserDialog
Windows Forms ( 17.9).
17.9. FolderPicker
var folderPicker = new FolderPicker();
folderPicker.FileTypeFilter.Add("*");
//
var folder = await folderPicker.PickSingleFolderAsync();
//
var files = await folder.GetFilesAsync();
//
var newFile = await folder.CreateFileAsync("hello.txt");
await FileIO.WriteTextAsync(newFile, "Hello World!");
, ,
(. 17.2). ,
,
"" .
, .
, :
Documents Library;
Music Library;
234
17
Pictures Library;
Videos Library;
Removable Storage.
. 17.2.
Documents Library ,
.
Documents Library.
File
Type Associations.
KnownFolders ( 17.10).
17.10. Picture Folder
( )
var folder = KnownFolders.PicturesLibrary;
, :
KnownFolders.HomeGroup;
KnownFolders.MediaServerDevices.
235
( ).
. ,
Supports any file type.
236
17
, . ,
FileOpenPage.xaml ( 17.11).
17.11. XAML- FileOpenPage.xaml
<Page
...
>
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">
<StackPanel VerticalAlignment="Center"
HorizontalAlignment="Center">
<TextBlock Text=" FileOpenPage.xaml" FontSize="72" />
<Button Content=" " HorizontalAlignment="Center"/>
</StackPanel>
</Grid>
</Page>
App.xaml.cs
OnFileOpenPickerActivated,
( 17.12).
17.12. OnFileOpenPickerActivated App.xaml.cs
sealed partial class App : Application
{
...
protected override void OnFileOpenPickerActivated(
FileOpenPickerActivatedEventArgs args)
{
base.OnFileOpenPickerActivated(args);
var frame = new Frame();
Window.Current.Content = frame;
frame.Navigate(typeof(FileOpenPage), args);
Window.Current.Activate();
}
}
237
. , () args.
FileOpenPage.xaml
( 17.13). Logo.png .
17.13.
public sealed partial class FileOpenPage : Page
{
public FileOpenPage()
{
this.InitializeComponent();
}
private FileOpenPickerActivatedEventArgs _args;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
_args = e.Parameter as FileOpenPickerActivatedEventArgs;
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
var file = await Package.Current.InstalledLocation.GetFileAsync(
@"Assets\Logo.png");
if (_args != null)
{
var result = _args.FileOpenPickerUI.AddFile("fileId", file);
}
}
}
17.13 ,
, . ,
IStorageFile, , ,
.
, FileOpenPicker,
(. 17.4).
(. 17.5).
238
17
. 17.4.
. 17.5. FileOpenPage.xaml
239
StorageApplicationPermissions
. , ,
. ,
, , .
Windows 8
.
, , , FileOpenPicker,
( 17.14).
17.14.
var filePicker = new FileOpenPicker();
filePicker.FileTypeFilter.Add("*");
var file = await filePicker.PickSingleFileAsync();
var fileToken = StorageApplicationPermissions.FutureAccessList.Add(file);
FutureAccessList.Add,
, .
( 17.15).
17.15.
var accessList = StorageApplicationPermissions.FutureAccessList;
if (accessList.ContainsItem(fileToken))
240
17
{
var file = await accessList.GetFileAsync(fileToken);
}
FutureAccessList.Entries.
,
, ( 17.16).
17.16.
var fileToken = StorageApplicationPermissions.FutureAccessList.Add(file,
file.DisplayName);
. , , ,
.
File Type Associations.
,
txt, png . . qwerty
(. 17.6).
,
.
( Icon.png).
App.xaml.cs
OnFileActivated ( 17.17).
17.17.
sealed partial class App : Application
{
...
protected override void OnFileActivated(FileActivatedEventArgs args)
{
var frame = new Frame();
Window.Current.Content = frame;
241
frame.Navigate(typeof(MainPage), args.Files);
Window.Current.Activate();
}
}
. 17.6.
() MainPage.xaml. MainPage.xaml , .
( 17.18).
17.18.
public sealed partial class MainPage : Page
{
public MainPage()
242
17
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
var files = e.Parameter as IReadOnlyList<IStorageItem>;
if (files != null)
{
StringBuilder sb = new StringBuilder();
foreach (var file in files)
{
sb.AppendLine(file.Name);
}
MessageDialog msg = new MessageDialog(sb.ToString());
msg.ShowAsync();
}
}
...
, qwerty
(. 17.7). .
qwerty .
.
, . , FTP- ftp,
http https. qwerty.
Protocol (. 17.8).
OnActivated App.xaml.cs ( 17.19).
17.19.
sealed partial class App : Application
{
...
protected override void OnActivated(IActivatedEventArgs args)
{
if (args.Kind == ActivationKind.Protocol)
{
var protocolArgs = args as ProtocolActivatedEventArgs;
var uri = protocolArgs.Uri;
. 17.7.
. 17.8.
243
244
17
var rootFrame = new Frame();
rootFrame.Navigate(typeof(MainPage), uri);
Window.Current.Content = rootFrame;
}
Window.Current.Activate();
}
MainPage.xaml
, .
FileOpenPicker
FileSavePicker, FolderPicker.
StorageApplicationPermissions,
.
,
"", .
.
File Open Picker File Save Picker
, .
, , txt , , ftp.
Taa18
(Web) . , . ,
,
, .
, .
Windows 8 .
,
, .
, . .
,
. Blank App
Camera App.
,
Webcam. ,
Microphone (. 18.1).
CameraCaptureUI
/ CameraCaptureUI. , ( ), . CameraCaptureUI , . , ,
.
246
18
. 18.1.
MainPage.xaml ,
Image. XAML MainPage 18.1.
18.1. MainPage
<Page
...
>
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">
<Button Content=" "/>
<Image x:Name="imgMain" Width="640" Height="480"/>
</Grid>
</Page>
. CameraCaptureUI ( 18.2).
247
18.2.
private async void Button_Click(object sender, RoutedEventArgs e)
{
var camera = new CameraCaptureUI();
StorageFile file = await
camera.CaptureFileAsync(CameraCaptureUIMode.Photo);
if (file != null)
{
BitmapImage bitmapImage = new BitmapImage();
using (IRandomAccessStream fileStream = await
file.OpenAsync(FileAccessMode.Read))
{
bitmapImage.SetSource(fileStream);
}
imgMain.Source = bitmapImage;
}
}
18.2
, , , Image .
!
NULL. ( "").
NULL. NULL, .
. ,
, (. 18.2).
, , , , ,
.
CameraCaptureUIMode.Photo CameraCaptureUIMode.Video,
, .
. MediaElement ( 18.3).
248
18
. 18.2.
18.3. MediaElement
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Button Content=" " Click="Button_Click" />
<MediaElement x:Name="meMain" Width="640" Height="480"/>
</Grid>
( 18.4).
18.4.
private async void Button_Click(object sender, RoutedEventArgs e)
{
var camera = new CameraCaptureUI();
StorageFile file = await
camera.CaptureFileAsync(CameraCaptureUIMode.Video);
if (file != null)
{
IRandomAccessStream fileStream = await
file.OpenAsync(FileAccessMode.Read);
meMain.SetSource(fileStream, "video/mp4");
}
}
249
CameraCaptureUIMode.Video,
CameraCaptureUIMode.PhotoOrVideo. .
CameraCaptureUI PhotoSettings VideoSettings, . .
PhotoSettings.AllowCropping
AllowCropping ( true) ,
( 18.5). , .
18.5. AllowCropping
var camera = new CameraCaptureUI();
camera.PhotoSettings.AllowCropping = true;
PhotoSettings.CroppedAspectRatio
CroppedAspectRatio . , , , .
18.6 , 2 1
.
18.6.
var camera = new CameraCaptureUI();
camera.PhotoSettings.CroppedAspectRatio = new Size(2,1);
, . ,
AllowCropping false. , CroppedAspectRatio CroppedSizeInPixels.
PhotoSettings.CroppedSizeInPixels
, ,
, CroppedSizeInPixels,
250
18
, ( 18.7).
18.7.
var camera = new CameraCaptureUI();
camera.PhotoSettings.CroppedSizeInPixels = new Size(200,200);
, . -,
. ,
, ,
, . , , , , .
PhotoSettings.Format
Format CameraCaptureUIPhotoFormat . : JPEG, PNG JPEG XR.
JPEG XR , Windows
Media Photo. , JPEG. JPEG
XR .
JPEG XR 18.8.
18.8.
var camera = new CameraCaptureUI();
camera.PhotoSettings.Format = CameraCaptureUIPhotoFormat.JpegXR;
JPEG XR , . .
. , JPEG ( ) PNG.
PhotoSettings.MaxResolution
, ,
. MaxResolution
CameraCaptureUIMaxPhotoResolution :
HighestAvailable ( );
VerySmallQvga ( 320240);
SmallVga ( 320240);
251
MediumXga ( 1024768);
Large3M ( 19201080);
VeryLarge5M ( 5 ).
( 18.9).
18.9.
var camera = new CameraCaptureUI();
camera.PhotoSettings.MaxResolution=
CameraCaptureUIMaxPhotoResolution.MediumXga;
VideoSettings.AllowTrimming
, "" . AllowTrimming
( 18.10).
18.10. AllowTrimming
var camera = new CameraCaptureUI();
camera.VideoSettings.AllowTrimming = false;
VideoSettings.Format
Format , ,
( 18.11).
MP4 ( ) WMV.
18.11.
var camera = new CameraCaptureUI();
camera.VideoSettings.Format = CameraCaptureUIVideoFormat.Wmv;
VideoSettings.MaxDurationInSeconds
MaxDurationInSeconds ( 18.12).
. AllowTrimming false. , - ,
,
, .
252
18
18.12.
var camera = new CameraCaptureUI();
camera.VideoSettings.MaxDurationInSeconds = 10;
VideoSettings.MaxResolution
, ( 18.13). MaxResolution
:
HighestAvailable ;
LowDefinition ;
StandardDefinition ;
HighDefinition .
, . ,
MaxResolution.
18.13.
var camera = new CameraCaptureUI();
camera.VideoSettings.MaxResolution =
CameraCaptureUIMaxVideoResolution.HighDefinition;
MediaCapture
/
/ . ,
,
,
. MediaCapture, c ,
.
.
MediaCapture ( 18.14). .
18.14. MediaCapture
private MediaCapture _mediaCapture;
protected override async void OnNavigatedTo(NavigationEventArgs e)
253
{
if (_mediaCapture == null)
{
_mediaCapture = new MediaCapture();
try
{
await _mediaCapture.InitializeAsync();
_mediaCapture.RecordLimitationExceeded += async (sender) =>
{
//
await _mediaCapture.StopRecordAsync();
};
}
catch (UnauthorizedAccessException)
{
//
}
}
}
, StartRecordToStorageFileAsync,
, IStorageFile.
(
CameraCaptureUI,
). StartRecordToStreamAsync
.
, .
MainPage.xaml.
, , . ( 18.15).
18.15.
private InMemoryRandomAccessStream _stream;
//
private async void Start_Button_Click(object sender, RoutedEventArgs e)
{
try
{
_stream = new InMemoryRandomAccessStream();
var encodingProfile =
MediaEncodingProfile.CreateMp3(AudioEncodingQuality.Auto);
254
18
await _mediaCapture.StartRecordToStreamAsync(encodingProfile,
_stream);
}
catch (Exception ex)
{
//
}
}
//
private async void Stop_Button_Click(object sender, RoutedEventArgs e)
{
await _mediaCapture.StopRecordAsync();
}
//
private void Play_Button_Click(object sender, RoutedEventArgs e)
{
meMain.SetSource(_stream, "audio/mp3");
meMain.Play();
}
, , .
, MP3 MediaEncodingProfile.CreateMp3.
MediaElement,
CameraCaptureUI .
.
CaptureElement,
( 18.16).
18.16. CaptureElement
<CaptureElement x:Name="ceMain" Width="1024" Height="768" />
MediaCapture
CaptureElement StartPreviewAsync
( 18.17).
18.17.
ceMain.Source = _mediaCapture;
await _mediaCapture.StartPreviewAsync();
255
. 18.3. ""
,
"" ( 18.18). . ,
() "", 17.
18.18.
private StorageFile _recordVideoFile;
//
private async void Start_Button_Click(object sender, RoutedEventArgs e)
{
try
{
_recordVideoFile =
await KnownFolders.VideosLibrary.CreateFileAsync("video.mp4",
CreationCollisionOption.GenerateUniqueName);
var encodingProfile =
MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto);
await _mediaCapture.StartRecordToStorageFileAsync(
encodingProfile, _recordVideoFile);
}
256
18
catch (Exception ex)
{
//
}
MediaCapture
CapturePhotoToStorageFileAsync CapturePhotoToStreamAsync. ,
, ,
- .
MediaCapture
,
. CameraCaptureUI . , ?
DeviceInformation.
, ( 18.19).
18.19.
var cameras = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
var microphones = await
DeviceInformation.FindAllAsync(DeviceClass.AudioCapture);
var camera = cameras.FirstOrDefault();
var microphone = microphones.FirstOrDefault();
if (camera != null && microphone != null)
{
var settings = new MediaCaptureInitializationSettings()
{
AudioDeviceId = microphone.Id,
VideoDeviceId = camera.Id
};
await _mediaCapture.InitializeAsync(settings);
}
MediaCapture
VideoDeviceController.
257
:
BacklightCompensation ;
Brightness ;
Contrast ;
Exposure ;
Focus ;
Hue ;
Pan ;
Roll ;
Tilt ;
WhiteBalance ;
Zoom .
,
CameraOptionsUI ( 18.20).
18.20.
CameraOptionsUI.Show(_mediaCapture);
(. 18.4)
, , .
AudioDeviceController
:
Muted ( -
true false);
VolumePercent (-
0 100).
. 18.4. CameraOptionsUI
258
18
Windows Store-.
/ .
CameraCaptureUI.
, ( , ),
.
.
"" ,
. ,
CameraCaptureUI, .
, , , .
.
Taa19
,
. , Bing Maps Microsoft, , , ,
. .
,
,
. , ,
, , , ,
. , ,
, . , , . ,
, , . - , , , .
, Bing Maps SDK,
Microsoft.
Windows 8, Bing Maps SDK . , SDK Windows 8, Bing.
,
, . GPS (Global Position System), -
260
19
. Blank App
LocationApp.
Package.appxmanifest Capabilities
Location (. 19.1).
MainPage.xaml ( 19.1).
,
txtLatitide, txtLongitude txtAccuracy .
. 19.1.
261
262
19
<TextBlock x:Name="txtLatitide" Style="{StaticResource
HeaderTextStyle}" Margin="5"/>
<TextBlock x:Name="txtLongitude" Style="{StaticResource
HeaderTextStyle}" Margin="5"/>
</StackPanel>
</Grid>
</Page>
API , , ( ).
btnLocation.
.
Windows.Devices.Geolocation.
GetGeopositionAsync ( 19.2).
Geolocator
19.2.
private async void BtnLocationClick(object sender, RoutedEventArgs e)
{
var geolocator = new Geolocator();
try
{
var position = await geolocator.GetGeopositionAsync();
txtAccuracy.Text = String.Format(" {0} ",
position.Coordinate.Accuracy);
txtLatitide.Text = String.Format(": {0}",
position.Coordinate.Latitude);
txtLongitude.Text = String.Format(": {0}",
position.Coordinate.Longitude);
}
catch (Exception)
{
// -
}
}
GetGeopositionAsync Geoposition,
Coordinate Geooordinate. Geooordinate (. 19.1).
263
19.1. Geooordinate
Accuracy
Latitude
Longitude
Speed
Altitude
AltitudeAccuracy
Heading
Timestamp
, (,
IP-), null.
. btnLocation
, (. 19.2). ,
(. 19.3).
. 19.2.
. 19.3.
, , DesiredAccuracy
Geolocator ( 19.3).
.
264
19
19.3.
var geolocator = new Geolocator();
geolocator.DesiredAccuracy = PositionAccuracy.High;
, , ,
. .
( ). . LocationStatus
Geolocator. StatusChanged.
, , Disabled.
.
Geolocator
. ,
Geolocator .
,
. btnLocation.
, .
- , , , . .
.
, Geolocator
PositionChanged ( 19.4).
19.4.
public sealed partial class MainPage : Page
{
private Geolocator _geolocator;
public MainPage()
{
InitializeComponent();
}
265
,
, ( ) Dispatcher.RunAsync.
PositionChanged? , . MovementThreshold ( ) Geolocator. 19.5 , .
19.5.
_geolocator = new Geolocator();
_geolocator.MovementThreshold = 1000;
_geolocator.PositionChanged += GeolocatorPositionChanged;
, PositionChanged , MovementThreshold, ,
, - .
266
19
MovementThreshold .
.
, ,
PositionChanged.
ReportInterval,
, .
, . 19.6
ReportInterval .
19.6.
_geolocator = new Geolocator();
_geolocator.MovementThreshold = 1000;
_geolocator.ReportInterval = 60 * 1000;
_geolocator.PositionChanged += GeolocatorPositionChanged;
ReportInterval , , .
ReportInterval,
. , .
ReportInterval.
:
, .
, . (. 19.4).
, , ,
(. 19.5). Set
Location.
, .
, ,
, , , . ,
.
10.
. 19.4.
267
. 19.5.
268
19
269
. 19.8.
Windows Store
(x86, x64, ARM), , Bing Maps SDK.
,
Map.
, , ( 19.7).
19.7. MainPage Map
<Page
x:Class="LocationApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:LocationApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup- compatibility/2006"
xmlns:bing="using:Bing.Maps"
mc:Ignorable="d">
270
19
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button x:Name="btnLocation"
Content=" " Grid.Row="0"
VerticalAlignment="Center" HorizontalAlignment="Center"
Margin="10" Click="BtnLocationClick"/>
XML
bing:
xmlns:bing="using:Bing.Maps", Map: <bing:Map
Grid.Row="1" x:Name="map"/>.
,
(. 19.9).
, ,
. Map
. 19.9. Map
271
Bing,
.
Bing Maps: http://www.bingmapsportal.com/.
,
Credentials Map.
, ( 19.8).
19.8. API Bing Maps
<bing:Map Grid.Row="1" x:Name="map"
Credentials="AsWlUnHbvLgHlLHaRhTZLslewv1QIdGppxOqyL-6He2jxyHvLAjutrcntemUihw9"/>
, 19.8, . .
: /
( ZoomIn ZoomOut), "/
" (LayoutChange) ( 19.9).
19.9.
<Page
...
>
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal"
HorizontalAlignment="Center">
<Button x:Name="btnLocation"
Content=" " Grid.Row="0"
VerticalAlignment="Center" HorizontalAlignment="Center"
Margin="10" Click="BtnLocationClick"/>
<Button Name="ZoomIn" Content="+"
HorizontalAlignment="Center"
VerticalAlignment="Bottom" Height="60" Width="60"
FontWeight="Bold" Padding="0,-9,0,0"/>
<Button Name="ZoomOut" Content="-"
HorizontalAlignment="Center"
VerticalAlignment="Bottom" Height="60" Width="60"
FontWeight="Bold" Padding="0,-9,0,0" />
272
19
<Button Name="LayoutChange" Content="L"
HorizontalAlignment="Center" VerticalAlignment="Bottom"
Height="60" Width="60"
FontWeight="Bold" Padding="0,-9,0,0"/>
</StackPanel>
19.10.
19.10.
private void ZoomInClick(object sender, RoutedEventArgs e)
{
if (map.ZoomLevel <= 19) map.ZoomLevel++;
}
private void ZoomOutClick(object sender, RoutedEventArgs e)
{
if (map.ZoomLevel >= 2) map.ZoomLevel--;
}
private void LayoutChangeClick(object sender, RoutedEventArgs e)
{
if (map.MapType == MapType.Road)
map.MapType = MapType.Aerial;
else
map.MapType = MapType.Road;
}
.
GeolocatorPositionChanged SetView ( 19.11).
19.11.
void GeolocatorPositionChanged(Geolocator sender, PositionChangedEventArgs
args)
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
var location = new Location(args.Position.Coordinate.Latitude,
args.Position.Coordinate.Longitude);
273
map.SetView(location, 10);
});
}
SetView . , .
,
.
,
, .
MainPage Pushpin ( 19.12).
19.12. Pushpin
private Pushpin _pushpin = new Pushpin();
Pushpin ,
( 19.13).
19.13. Pushpin
void GeolocatorPositionChanged(Geolocator sender, PositionChangedEventArgs
args)
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
var location = new Location(args.Position.Coordinate.Latitude,
args.Position.Coordinate.Longitude);
map.SetView(location, 10);
MapLayer.SetPosition(_pushpin, location);
if (!map.Children.Contains(_pushpin))
{
map.Children.Add(_pushpin);
}
});
}
Pushpin
SetPosition MapLayer.
. (. 19.10).
274
19
. 19.10. Pushpin
, , .
Geolocator.
, .
Bing Maps SDK, Bing. , Map,
, .
Taa20
, Windows 8,
,
" ", . . , , , , , ,
.
, ,
: ( 19), ,
. , -,
,
, .
, , , , . . , / , , . API , ,
, .
. , .
,
.
. , , ,
,
276
20
(. 20.1). , , .
,
.
. 20.1.
Grid LayoutRoot,
txtLight.
, , , - .
LightSensor
-
Windows.Devices.Sensors.
277
, LightSensor.GetDefault(). null, .
, , ,
. ( 20.2).
20.2.
var lightSensor = LightSensor.GetDefault();
if (lightSensor != null)
{
var val = lightSensor.GetCurrentReading();
}
,
, . ReadingChanged LightSensor. C#- MainPage 20.3.
20.3.
public sealed partial class MainPage : Page
{
private LightSensor _lightSensor;
public MainPage()
{
this.InitializeComponent();
_lightSensor = LightSensor.GetDefault();
if (_lightSensor != null)
{
_lightSensor.ReadingChanged += LightSensorReadingChanged;
}
}
void LightSensorReadingChanged(LightSensor sender,
LightSensorReadingChangedEventArgs args)
{
}
}
, ( 20.4).
278
20
20.4.
void LightSensorReadingChanged(LightSensor sender,
LightSensorReadingChangedEventArgs args)
{
var reading = args.Reading;
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
LayoutRoot.Background = new SolidColorBrush(Color.FromArgb(255,
(byte)(reading.IlluminanceInLux / 2), 0, 0));
txtLight.Text = reading.IlluminanceInLux.ToString();
});
}
,
ReportInterval. ( 20.5).
20.5.
_lightSensor.ReportInterval = _lightSensor.MinimumReportInterval;
(Resource leak),
, , ( 20.6).
20.6.
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
if (_lightSensor != null)
{
_lightSensor.ReadingChanged -= LightSensorReadingChanged;
}
base.OnNavigatedFrom(e);
}
(g ), (. 20.2).
279
. 20.2.
. ,
Z- 1 ( Z , , , 1g). ,
, Y- 1.
, .
, , 1g.
Accelerometer, Windows.Devices.Sensors. , , ,
GetDefault().
AccelerometerReading,
AccelerationX, AccelerationY AccelerationZ, .
, , 20.7.
20.7.
public sealed partial class MainPage : Page
{
private Accelerometer _accelerometer;
public MainPage()
{
this.InitializeComponent();
_accelerometer = Accelerometer.GetDefault();
if (_accelerometer != null)
280
20
{
_accelerometer.ReadingChanged += AccelerometerReadingChanged;
}
}
void AccelerometerReadingChanged(Accelerometer sender,
AccelerometerReadingChangedEventArgs args)
{
//
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
AccelerometerReading reading = args.Reading;
var x = reading.AccelerationX;
var y = reading.AccelerationY;
var z = reading.AccelerationZ;
});
}
"" . ,
, (. 20.3).
. 20.3.
, ,
( ).
, . , .
. . 20.4 , , . , .
, , , . -
281
,
( 20.8). Shaken.
. 20.4. , ,
20.8.
public MainPage()
{
this.InitializeComponent();
_accelerometer = Accelerometer.GetDefault();
if (_accelerometer != null)
{
_accelerometer.ReadingChanged += AccelerometerReadingChanged;
_accelerometer.Shaken += AccelerometerShaken;
}
}
void AccelerometerShaken(Accelerometer sender, AccelerometerShakenEventArgs
args)
{
}
.
. , , ,
. , , , .
282
20
. . Gyrometer ( 20.9).
20.9.
public sealed partial class MainPage : Page
{
private Gyrometer _gyrometer;
public MainPage()
{
this.InitializeComponent();
_gyrometer = Gyrometer.GetDefault();
if (_gyrometer != null)
{
_gyrometer.ReadingChanged += GyrometerReadingChanged;
}
}
void GyrometerReadingChanged(Gyrometer sender,
GyrometerReadingChangedEventArgs args)
{
//
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
GyrometerReading reading = args.Reading;
//
var x = reading.AngularVelocityX;
var y = reading.AngularVelocityY;
var z = reading.AngularVelocityZ;
});
}
}
( . incline ) ,
.
Windows 8, . .
.
, ( -
283
)
Sensor Fusion (. 20.5).
, .
. , .
.
: Roll (), Pitch () Yaw
(),
(. 20.6).
284
20
, ( ).
. 20.7 Roll, Pitch Yaw .
, . Z (Yaw)
, .
X (Pitch) , , . Y (Roll) .
.
( ,
). - . DirectX,
.
. ,
.
. .
Blank App InclinometerApp.
XAML- MainPage 20.10.
20.10. XAML- MainPage
<Page
...
>
<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Center">
285
286
20
private void ProcessCurrentReading(object sender, object args)
{
InclinometerReading reading = _inclinometer.GetCurrentReading();
if (reading != null)
{
//
var top = (double)rectMain.GetValue(Canvas.TopProperty);
var left = (double)rectMain.GetValue(Canvas.LeftProperty);
rectMain.SetValue(Canvas.TopProperty,
top (reading.PitchDegrees / (double)4));
rectMain.SetValue(Canvas.LeftProperty,
left (reading.RollDegrees / (double)4));
//
txtRoll.Text = String.Format("Roll: {0,5:0.00}",
reading.RollDegrees);
txtPitch.Text = String.Format("Pitch: {0,5:0.00}",
reading.PitchDegrees);
txtYaw.Text = String.Format("Yaw: {0,5:0.00}",
reading.YawDegrees);
}
}
. , ReadingChanged .
.
.
, . , .
Sensor Fusion.
,
. Compass.
. ,
, , , .
287
,
,
. , .
( ), VSM (Visual
State Manager), ApplicationView.Value ( , ). 9. .
SimpleOrientationSensor.
20.12.
20.12.
SimpleOrientationSensor orientation
= SimpleOrientationSensor.GetDefault();
if(orientation!=null)
{
var currentOrientation = orientation.GetCurrentOrientation();
}
OrientationChanged
SimpleOrientationSensor.
, , . 20.1.
20.1. ,
NotRotated
Rotated90DegreesCounterclockwise
90
Rotated180DegreesCounterclockwise
180
Rotated270DegreesCounterclockwise
270
Faceup
Facedown
,
View ApplicationView: FullScreenLandscape,
FullScreenPortrait, Filled Snapped.
288
20
, , "" .
,
OrientationSensor.
.
, .
.
. GetDefault . null.
null .
. .
, , ,
, , Sensor Fusion .
, .
Taa21
,
. , , , .
,
, . - .
,
. , , ,
, .
, , .
. .
, . .
, , ,
.
, , , ,
, , .
(Internationalization, i18n), . ,
.
.
, .
290
21
, , .
, . , .
,
, . ,
, .
Windows Store- .NET- Windows Phone . , Windows 8, ,
, . , .
291
21.2.
var cultureInfo = new CultureInfo("ru-RU");
// 30 2012 .
var date = DateTime.Now.ToString("D", cultureInfo);
, ( 21.3).
21.3.
const double money = 127800.30;
var strMoney = money.ToString("C");
"ru-RU" strMoney 127 800,30 ., "enUS" $127,800.30, "de-DE" 127.800,30 "it-IT" 127.800,30. , ,
, . ,
. . , .
,
,
CultureInfo.InvariantCulture, ,
- .
, .
( Package.appxmanifest).
Default language (. 21.1).
, , . ,
"ru-RU". , , "en", .
( ) PrimaryLanguageOverride ApplicationLanguages
( 21.4).
21.4.
ApplicationLanguages.PrimaryLanguageOverride = "de-DE";
Windows 8 Windows
, ( -
292
21
. 21.1.
) . Windows 8 ,
. , , , . , , ( )
.
(Control Panel) Control
Panel | Language (. 21.2).
. 21.2.
, . Windows Store
GlobalizationPreferences.Languages.
( . " " ), -
293
, , , .
, , -
( ), .
, , , .
Windows Store- ( , WPF, Silverlight
Windows Phone-) XAML. XAML-, , , . Windows 8
,
XAML.
, "Hello!" "World!"
( 21.5).
, , .
21.5.
<StackPanel>
<TextBlock Text="Hello!" Width="400"
HorizontalAlignment="Left" Margin="10"
Style="{StaticResource HeaderTextStyle}" />
<TextBlock Text="World!" Width="400"
HorizontalAlignment="Left" Margin="10"
Style="{StaticResource HeaderTextStyle}" />
</StackPanel>
: Width,
HorizontalAlignment Margin. (x:Uid) .
Hello World ( 21.6).
21.6.
<StackPanel>
<TextBlock x:Uid="Hello" Text="Hello!" Width="400"
HorizontalAlignment="Left" Margin="10"
Style="{StaticResource HeaderTextStyle}" />
294
21
,
. Languages ( ) : en-US ru-RU. Resources.resw, Resource File (.resw)
(. 21.3).
. 21.3.
resw .NET-
resx: , resw- . en-US
, . 21.1 (. 21.4).
21.1. en-US
Hello.HorizontalAlignment
Left
Hello.Text
Hello!
Hello.Width
400
World.Text
World!
295
. 21.4. en-US
ru-RU . 21.2.
21.2. ru-RU
Hello.HorizontalAlignment
Right
Hello.Text
Hello.Width
500
World.Text
. . ,
.
, "!", , "!". "Hello!",
, "World!".
Windows 8 ( ).
, , .NET
Framework, .
Windows 8 .lang-.
, ru-RU : Resources.lang-ru-RU.resw.
296
21
:
Resources.lang-de-DE.resw;
Resources.lang-de-AT.resw;
Resources.lang-de-CH.resw.
, ,
: Resources.resw.
, , , , Languages,
, Localization. .
. , "en",
"ru", "de". , , . "en-US" .lang-en-US .
"de-DE" .lang-de-DE.
, ,
, ? ,
.
:
Languages\de\Resources.lang-de-DE.resw;
Languages\de\Resources.lang-de-AT.resw;
Languages\de\Resources.lang-de-CH.resw.
:
Languages\de-DE\Resources.resw;
Languages\de-AT\Resources.resw;
Languages\de-CH\Resources.resw.
, , .
, ,
Images\logo.png, ,
:
Images\en\logo.png;
Images\ru\logo.png
( 21.7).
297
21.7. XAML-
<Image Source="Images/logo.png" />
9, , . :
Images\ru\logo.scale-100.png;
Images\ru\logo.scale-140.png;
Images\ru\logo.scale-180.png.
(contrast-white
contrast-black).
( High
Contrast PC settings | Ease of Access):
Images\ru\contrast-black\logo.scale-100.png;
Images\ru\logo.contrast-black_scale-100.png.
. , ErrorMessage,
( 21.8).
21.8.
var resourceLoader = new ResourceLoader();
var message = resourceLoader.GetString("ErrorMessage");
.
-
Resources.resw. , Errors.resw.
Errors.resw, ResourceLoader ( 21.9).
21.9. Errors.resw
var resourceLoader = new ResourceLoader("Errors");
var message = resources.GetString("ErrorMessage");
298
21
, , . ,
Errors.resw LocalizationLibrary.dll, ( 21.10).
21.10.
var resourceLoader = new ResourceLoader("LocalizationLibrary/Errors");
var message = resources.GetString("ErrorMessage");
Windows Store- .
(
):
ApplicationDisplayName;
ApplicationShortName;
ApplicationDescription.
, .
ms-resource:, , ms-resource:ApplicationDisplayName (. 21.5).
. 21.5.
299
, , , .
Windows Store. , , ,
,
.
Windows Store-
, . .
. ,
. , , Windows 8, .
Taa22
Windows 8
Windows 8, Microsoft (,
Windows Phone, Xbox 360 Visual Studio 2012),
, . , .
-
, - . ,
, , , , ,
.
, ,
, , ,
.
Windows 8
, , ,
Windows Phone Windows 8,
"Metro"-. "Metro" , Windows Phone Windows 8.
, ,
(, , , "Avalon", Windows
Presentation Foundation, WPF), "Metro" , "Windows". -
Windows 8
301
Windows,
Windows, Windows 8.
, , ,
, , , , ,
.
Microsoft , , Windows Media Center (. 22.1).
Microsoft Zune
( ), (Zune Windows
Zune.net ) (. 22.2 22.3).
, Windows
Zune.net Silverlight Cosmopolitan.
, Windows Phone 7,
.
Microsoft, . ,
.
, ,
, . ,
302
22
. 22.2. Zune HD
Windows 8
303
Windows, ,
Microsoft.
(Bauhaus) (, ,
), , ,
.
(International Typographic Style,
Swiss Design) , , ( , ) (
). ,
.
(Motion Design) -
( ), , , ""
.
, , , , , ,
, , , Windows 8 Windows
Phone.
Windows
:
1. .
2. .
3. - .
4. .
5. .
.
, . ,
, ,
, , , , .
, - ,
, , .
304
22
, , , , - .
. . , , , , - , .
, (
).
,
(Information Architecture, IA). , , ,
, ,
, .
,
, , , .
,
: ,
.
, .
,
, .
( Windows 8
2020 px 55 px) (. 22.4).
. 22.4.
, ,
.
Windows 8
305
,
, ( , ).
, , ,
. , , ,
,
(. 22.5).
. 22.5.
306
22
, , .)
"" . . (
?) , ,
, iOS, . , , , , . ,
( ),
/ Windows
.
(
) ,
, .
, Windows ( Windows
Phone) , . .
Windows 8 Cocktail Flow (. 22.6).
, , .
,
, ,
.
Windows 8
307
"" . . . , . .
, , , .
Windows 8, , , ,
. , -
, ,
, .
, ( ),
.
. (, , ),
, , , (, ) .
!
" " ,
.
(Chrome).
, , ,
(, ,
, ). , .
:
;
;
.
.
. ,
, . "".
, (. 22.7).
308
22
, , (
), , , ,
( , ).
. : ,
, , . , () .
,
,
" ", "" . .
,
.
.
, " " (. 22.8).
, , - : , ,
, (
)
.
- , . Windows 8
.
Windows 8
309
. 22.8. ""
.
- , . . , , ,
,
.
,
. - , , , (),
, , " ".
, - ( ). Windows 8 ?
-, , "-", , ,
. .
-, ,
(, ,
), , , , (. 22.9).
310
22
, ,
, .
, .
, -
, , , , , .
23. ,
,
. , , ,
.
, .
, -
. (, ), , , .
.
.
Windows
. ,
, .
. , " -
Windows 8
311
", , , ,
.
. .
-
, ,
, .
, , "".
, .
. , , , (. 22.10).
. 22.10. ""
, ,
, , , . ,
( ).
, ,
Segoe UI,
312
22
Windows 8.
, ,
.
, , . , , ,
"" , ,
, , .
; , , , .
. , , ,
.
, ,
, . , , , .
,
,
, , ,
, ().
, Windows 8.
,
(Semantic Zoom), 8.
, , ,
"" ,
, , , , (. 22.11 22.12).
"", (/). ,
,
. , , , ,
, , (, , . .),
, , .
Windows 8
313
"". ( ). ,
Web-,
.
, "" .
, .
.
314
22
, - . (, ),
, , , , , ,
.
, "".
: , - ,
, "".
,
. ,
"" ,
, , ,
. , .
, ,
. , , , .
,
, ,
, , .
, "" , , .
. , .
,
. , ,
,
, .
, ( ) , ,
, , - .
, "", , .
Windows 8
315
Windows 8,
, , , . .
, . , , - (. 22.13).
. 22.13. Windows 8
, , Windows 8
" ", ,
, , (
7 ),
, .
. .
Windows 8 (
, ).
, , , , , ,
"-" ( ), , ,
.
, , Windows 8
316
22
(Animation Library)
Windows.UI.Xaml.Media.Animation XAML/C#
WinJS.UI.Animation HTML/JS.
"". , - "", . , "" , ,
.
10, Windows Store-,
, , .
, , , - .
, " " , .
( ).
. , , , ,
"". , , ,
, . "" .
, . . , , , . ,
,
.
"".
, , , , .
, . ,
,
, , ,
, .
"" , .
, , , , , . ,
, , .
Windows 8
317
, Windows Store, , .
. , , . ,
-.
,
, , / .
, :
,
, , , , ,
.
, ( , ).
Windows-
, .
, , : Windows 8
Windows RT. , Windows Store, , , ARM Intel/AMD- .
, GPU (" "), CPU (), , , .
,
, . , , . ,
.
, ,
.
.
. Windows 8 "",
.
,
.
. 1315 .
,
.
318
22
(Sharing) (, . .).
, Windows 8
"-" " ".
, : , , , .
, .
, ,
.
, , ,
. , , ,
.
(Mail),
, "",
(People), . .
.
, , , , , , . ,
, .
.
.
. , " ", . ( Visual Studio,
Adobe Photoshop), (
http://design.windows.com) Expression Blend (
XAML HTML) .
,
Windows:
1. .
, . "".
2. . ,
, .
Windows 8
319
3. - .
, , .
4. . , , .
5. . Windows Windows , , .
Taa23
,
Windows 8
, , ,
, Windows 8 Windows
Phone, (UX UI).
( ) Windows 8 , Web-. "" ,
,
.
, Windows 8 (
, C#, Visual Basic, JavaScript C++), , ( ) , . , ,
Windows 8 , .
, , , , ( )
.
,
. , , . : .
, Windows 8
321
Windows 8 ( , Windows Phone, , - ) , .
,
, , .
, :
1. .
2. .
3. .
4. .
5. .
1.
:
, ( ) .
( ), . , (
), :
?
?
, ?
, :
?
? ,
, , ?
,
?
, / , .
322
23
.
.
, ?
? , , 1015 ? , ,
, , ?
.
, . " ", , ,
, , .
.
?
, ?
, , ,
, , ? ,
,
, ,
?
, , ! ? ? ?
?
, , , , , ,
(), , .
- :
?
, -
, :
?
?
?
, Windows 8
323
?
- ?
. , . 23.1.
. 23.1.
-
. ,
. , ,
, .
, - (
., . .), () . , , (, ,
, ),
(. 23.1).
, .
23.1.
324
23
2. ?
, , , , .
, .
, , , (, "" "
").
, ,
( "best at
statement"). "Best at statement" ,
, , .
, :
" ".
"
".
1) , 2) 3) . ,
.
, , "
", ,
, , , , . , , , - ( ).
: " online" , , , ( ) ,
, ,
, ,
( ,
), .
, , (, ) : .
!
.
- ,
- , ,
, Windows 8
325
. ,
: ,
.
, : " ".
,
, , ( ).
Best = focus. ,
, .
3.
, , .
, "", (
" "), , .
: ?
:
?
?
. ,
, .
( /),
, ( ,
).
(. 23.2).
, "" , .
, .
, ,
. , , -
326
23
( )
(. 23.3).
. 23.2.
. 23.3.
/ ,
. ,
"best at statement" (. 23.4).
, ,
, "" (
, , ), , .
, , ,
, ,
( ),
.
, Windows 8
327
, /
, , ,
. . .
, ,
, - , .
. 23.4.
- , , ,
.
, , . ,
.
: 1) ; 2) ;
3) .
,
- , , , ( , ).
, "" ,
.
, , .
. ,
- , ( ) . , -
328
23
() . ,
,
.
"" ,
.
() .
.
., , " 7". "
", . ( ), Movie Meeting,
.
8 . , . .
.
. , , .
Movie Meeting
.
( , ). ,
, , , (. 23.5).
, ,
. , , .
,
.
("best at statement").
. -
, , .
, ,
(content/features provider
scenario provider).
, Windows 8
329
. 23.5.
4.
, ,
- . , . ,
.
, , .
( ).
. 23.6.
, , Windows 8,
: , ,
, , (, , , . .).
: , , , ,
Windows 8.
. 23.6.
330
23
, Windows 8
331
. , .
, ,
. ,
, ,
, , ,
. ,
.
, "" ,
/. - ():
, .
,
.
Movie Meeting
:
1.
2.
3.
4.
: .
: .
.
.
5. : .
6. : .
7. : , , .
8. + : .
, ,
, , ( )
(. 23.7).
"" , (Actions).
, - ,
-,
.
, ,
Windows 8.
"
Metro" : http://msdn.microsoft.com/ru-RU/library/windows/
apps/hh761500.
332
23
. 23.7.
,
.
Windows 8. ( ),
. , , . .
Susan Weinschenk
"The Psychologists View of UX Design"1: "People will do the least amount of work
possible to get a task done. It is better to show people a little bit of information and let
them choose if they want more details. The fancy term for this is progressive disclosure."
" .
, . progressive
disclosure ( )."
, ,
.
, ,
( , ,
).
Windows 8 : . , Master1
http://uxmag.com/articles/the-psychologists-view-of-ux-design.
, Windows 8
333
Details, , , "",
.
,
,
, .
,
, .
510 ,
, , ,
( ) .
, , -
"", (
) .
, ,
, , .
, (. 23.8).
. 23.8.
,
. ,
.
334
23
.
(3 . 23.9) "" (4 . 23.9). ( 5 . 23.9).
. 23.9.
.
(
, Navigation Bar),
, ,
(. 23.10).
, ,
.
, (, ), IM, , . ., .
. , Bing News
,
, (. 23.11 23.12).
(Semantic Zoom). Windows 8
, -
, Windows 8
335
. 23.10.
(, ). ,
, ,
(. 23.13).
, (. 23.14).
( ) , .
, - .
, ,
.
, (. 23.15).
336
23
, Windows 8
. 23.13. ,
. 23.14.
. 23.15.
337
338
23
, Windows 8
339
, Movie Meeting,
:
.
.
.
-
, ( /) .
.
, ,
, (. 23.17):
" " .
" //" -
""
.
" "
( , ).
. 23.17.
, (Landing Page) , ,
. , .
() ( ) , ,
, , / .
(. 23.18).
,
, (. 23.19).
340
23
. 23.18.
. 23.19.
, Windows 8
341
.
, , , :
() ;
( ,
, , );
;
/;
, ( ), -
, ;
, ;
;
-
;
;
( -
).
, , ,
.
,
, , .
(. 23.20).
. 23.21 , .
:
();
()
, . . " ";
,
( , ),
.
, .
. 23.20.
342
23
. 23.21.
, Windows 8
343
344
23
5.
, ,
.
() , , !
, ( : , ).
, ,
,
.
, .
, .
,
. " ", . . (. 23.22).
. 23.22.
(. 23.23).
, () , , .
. , .
,
.
. , (. 23.24).
, Windows 8
345
. 23.23.
. 23.24.
. 23.24 .
:
(
), . . .
,
, . . .
( , , )
: ,
.
346
23
, ( ) . ,
, Web- . Lenovo, ,
(. 23.25).
. 23.25.
.
, .
Windows 8 ,
. 23.26.
, ? , , :
( , )
"".
. 23.26. Windows 8
, Windows 8
347
, , ,
. Windows 8 :
+ ;
.
, , , (. 23.27).
. 23.27.
,
( ),
(
).
,
, , .
, ,
: (
) , , . () "",
.
"" (Charms), , .
, "-" . :
,
Search ( inline-, -
348
23
, , ).
,
, Share. (
, .)
, Settings. , Windows Store
, (,
).
,
(, )
"" (Devices).
, .
. , " ".
() , ( ).
-
( , ) , .
, "" . :
.
( )
(. 23.28).
, ( ), (), ( ) .
, .
. (
, ) (. 23.2).
- , :
?
?
""
, .
, Windows 8
349
23.2.
( !)
(Snapped Mode)
03
02
07 (3+4, 2+5)
05
. 23.28.
" " .
, ( ) // . .
, ,
, :
, (),
, ?
?
?
?
, , .
350
23
-
. 23.2.
Movie Meeting. .
? , . , ,
.
()? :
(. 23.29):
;
( Web-).
. 23.29.
(. 23.30):
- , ;
(, );
/;
;
.
( )?
:
:
;
;
;
;
.
, Windows 8
351
:
.
, , ""
. .
. 23.30.
.
(. 23.31):
, -
.
, (,
- ).
. 23.31.
352
23
,
.
:
.
.
. .
(. 23.32):
,
, .
- , , (Invite+) .
/ . ,
. ,
, .
, .
"" .
:
,
.
. 23.32.
, Windows 8
353
. ,
,
, .
, , ,
, , .
,
:
.
- ,
.
,
.
?
"best at statement".
- ,
.
.
- , .
,
.
.
.
, -
. , , ,
.
.
, .
, , ,
.
, . , ( , ,
).
Taa24
Windows Store
Windows Store Windows 8 (. 24.1),
,
, Windows 8.
Windows 8 (Developer Preview,
Consumer Preview Release Preview) Microsoft
16 , 7 Release Preview.
Windows 8
7 , ,
Windows Store
355
Windows Store , , , , .
Windows Store, . $49 $99 . DreamSpark (http://www.dreamspark.ru).
Windows Store
(). , ,
. ,
, , . , , .
,
. , ,
Windows Store . , .
, Windows Store,
.
: . API
- (Trial) : ( ) ( ). - , .
.
Windows Store (In-App
Purchases) API. , .
.
Windows Store . ,
Microsoft.
, . , , $25 000, 70/30: 70% , 30% Microsoft.
$25 000, 80%
.
. Microsoft
"" Microsoft Advertising
SDK .
.
356
24
Windows Store
Windows ,
(. 24.2).
, Windows 8, , .
Windows Store : (, , . .) .
. . 24.3 "".
. 24.2.
. 24.3. ""
Windows Store
357
, Windows Store , ,
-, " ".
, , : , . . (. 24.4).
. 24.4.
. 24.5.
358
24
,
(. 24.5).
Windows Store
, , Windows 8. :
Windows;
Windows Pro;
Windows RT.
PC
(x86/x64),
ARM, , , . , Windows RT, , , .
Windows Windows Pro Windows-
Windows Store-. ,
"Designed for Windows 7" - ,
Windows 8, .
Windows RT . ARM-
Windows-
( Windows RT ).
, Windows Store- Microsoft
Windows/Windows Pro, Windows RT.
Windows Store-, C++ (Native) ,
Windows Store. ,
Windows RT, , Windows Store.
, Windows RT ARM-
MS Office, .
, Windows Store-,
, Windows 8
.
Windows Store
Windows Store :
1. Microsoft Account ( Live ID). Microsoft
Account, . Microsoft
Account .
. , Microsoft Account ,
/ .
Windows Store
359
2. , , . ,
- ,
. -
,
.
3. , , Windows Store.
, Microsoft Account.
, . Windows:
DreamSpark;
BizSpark;
MSDN ( Visual Studio Professional, Test Professional,
Premium Ultimate).
MSDN ,
"Subscription Benefits" MSDN-
"Windows Store developer account". () Windows Store. 610 .
Windows Store :
https://appdev.microsoft.com/StorePortals/Account/Signup/Start.
Microsoft Account. Windows ( ) Microsoft Account
(Security Code).
. "" Microsoft Account.
.
, "I trust this PC"
( Cookies).
(. 24.6).
, , , .
, . . .
. Individual (
), Company ( ).
, . .
,
360
24
. 24.6.
. ,
Windows- . ,
, :
enterpriseAuthentication Windows -
;
sharedUserCertificates
- ;
documentsLibrary -
, , .
. Windows Store. , ,
,
Windows Store. , " ".
,
, . , ,
, .
.
, , , .
Web- Web-,
. ,
Windows Store
361
, ,
.
(Publisher Display Name) , -
. , . , . .
Windows Store. , ,
.
, . ,
.
.
VAT ID ( )
(), .
(Approver) Microsoft -
, , Approver info.
Approver info .
, Microsoft, Symantec GeoTrust.
, .
,
(, , ).
.
.
(), . .
!
, !
,
Windows Store.
. -
362
24
. ,
.
. .
https://appdev.microsoft.com/
StorePortals/en-us/Home ,
, , , .
Purchase ().
, Dashboard ( ) (. 24.7).
! !
. 24.7.
.
. :
Windows ,
.
.
Windows Store
363
, -
, , , .
Submit an app.
App name. App name . Reserve
app name.
,
. 21
. .
Windows Store
Windows Store,
Visual Studio Express STORE | Create App Packages...
PROJECT | Store | Create App Packages ... Visual Studio.
. 24.8.
364
24
. 24.9.
Windows Store .
, , , ,
. Visual Studio Windows App Certification Kit
(WACK), ,
. , .
WACK ,
Windows Store
365
. 24.11. WACK
366
24
-
, -:
( ) . - .
, - , "" .
LicenseInformation. CurrentApp,
CurrentAppSimulator ( 24.1). CurrentApp ,
Windows Store.
24.1.
//var licenseInformation = CurrentApp.LicenseInformation;
var licenseInformation = CurrentAppSimulator.LicenseInformation;
CurrentAppSimulator
WindowsStoreProxy.xml, :
<__>\Microsoft\Windows Store\ApiData
WindowsStoreProxy.xml 24.2.
24.2. WindowsStoreProxy.xml
<?xml version="1.0" encoding="utf-16"?>
<CurrentApp>
<ListingInformation>
<App>
<AppId>89644424-d0be-44ae-bb73-f38bf7037dd5</AppId>
<LinkUri>http://apps.windows.microsoft.com/app/89644424-d0be-44ae-bb73f38bf7037dd5</LinkUri>
<CurrentMarket>en-US</CurrentMarket>
<AgeRating>12</AgeRating>
<MarketData xml:lang="en-us">
<Name>Trial management full license</Name>
<Description>Sample app</Description>
<Price>4.99</Price>
<CurrencySymbol>$</CurrencySymbol>
</MarketData>
</App>
</ListingInformation>
<LicenseInformation>
<App>
Windows Store
367
<IsActive>true</IsActive>
<IsTrial>true</IsTrial>
<ExpirationDate>2012-12-01T01:00:00.00Z</ExpirationDate>
</App>
</LicenseInformation>
</CurrentApp>
WindowsStoreProxy.xml. XML-
, LicenceInfo.xml (. 24.12).
. 24.12.
LicenceInfo.xml
LicenceInfo.xml WindowsStoreProxy.xml.
LicenceInfo.xml WindowsStoreProxy.xml ( 24.3).
LicenceInfo.xml ( AppId). Packaging.
368
24
24.3. WindowsStoreProxy.xml
LicenceInfo.xml
var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(
"Microsoft\\Windows Store\\ApiData", CreationCollisionOption.OpenIfExists);
var file = await
Package.Current.InstalledLocation.GetFileAsync("LicenceInfo.xml");
var newfile = await folder.CreateFileAsync("WindowsStoreProxy.xml",
CreationCollisionOption.ReplaceExisting);
await file.CopyAndReplaceAsync(newfile);
WindowsStoreProxy.xml. IsTrial
LicenseInformation , -. - , ,
( 24.4).
24.4. -
//var licenseInformation = CurrentApp.LicenseInformation;
var licenseInformation = CurrentAppSimulator.LicenseInformation;
if (licenseInformation.IsActive)
{
if (licenseInformation.IsTrial)
{
var remaining = licenseInformation.ExpirationDate DateTime.Now;
}
else
{
// ...
}
}
CurrentApp CurrentAppSimulator
-, (In-App
Purchases). .
Windows Store ,
. ,
. -
Windows Store
369
370
24
poe
poee1
XAML
Foo SomeText.
C# ( 1.2).
1.2. Foo C#-
Foo foo = new Foo();
foo.SomeText = " ";
374
1.3 .
XAML-, C#,
. C#-
using.
, FooUser Foo,
( 1.4).
1.4. FooUser
using FooNamespace;
namespace SomeNamespace
{
public class FooUser
{
public FooUser()
{
Foo foo = new Foo();
foo.SomeText = " ";
}
}
}
!
, .
XAML
375
1.8. "x"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
376
XAML XML XAML .
,
. 1.3 SomeText .
( 1.9).
1.9.
<FooNamespace:Foo xmlns:FooNamespace="using:FooNamespace">
<FooNamespace:Foo.SomeText>
</FooNamespace:Foo.SomeText>
</FooNamespace:Foo>
,
.
( 1.10).
1.10.
<Grid x:Name="ContentPanel"
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Button Content="" Foreground="Yellow" Background="Blue"/>
</Grid>
"", (Foreground=
(Background="Blue").
"Yellow")
XAML
377
C# ( 1.12).
1.12.
Button newButton = new Button();
newButton.Content = "";
newButton.Foreground = new SolidColorBrush(Colors.Yellow);
newButton.Background = new SolidColorBrush(Colors.Blue);
ContentPanel.Children.Add(newButton);
,
Text ( ), Content. , . .
, CheckBox, RadioButton TextBox. RadioButton
( 1.13, . 1.1).
. 1.1.
1.13.
<Button>
<Button.Content>
<StackPanel>
<CheckBox Content="CheckBox"/>
<RadioButton>
<StackPanel>
<Button Content=" 1" />
<Button Content=" 2" />
<Button Content=" 3"/>
378
</StackPanel>
</RadioButton>
<TextBox />
</StackPanel>
</Button.Content>
</Button>
. Content.
<Button.Content> . 1.13 <RadioButton.Content> .
, . XAML.
, Foreground FontSize ( 1.14).
1.14.
<Style TargetType="Button" x:Key="buttonStyle">
<Setter Property="FontSize" Value="48"/>
<Setter Property="Foreground">
<Setter.Value>
<SolidColorBrush Color="Yellow"/>
</Setter.Value>
</Setter>
</Style>
,
.
(TargetType="Button").
, (x:Key="buttonStyle").
buttonStyle , Style ( 1.15).
1.15.
<Button Content="" Style="{StaticResource buttonStyle}"/>
1.16.
XAML
379
1.16.
<Page
...
>
<Page.Resources>
<Style TargetType="Button" x:Key="buttonStyle">
<Setter Property="FontSize" Value="48"/>
<Setter Property="Foreground">
<Setter.Value>
<SolidColorBrush Color="Yellow"/>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<Grid x:Name="ContentPanel"
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Button Content="" Style="{StaticResource buttonStyle}"/>
</Grid>
</Page>
. . , buttonStyle ( 1.17).
1.17.
<Style TargetType="Button" x:Key="newButtonStyle"
BasedOn="{StaticResource buttonStyle}">
<Setter Property="Background" Value="Blue"/>
</Style>
BasedOn.
, , . . , .
. ,
x:Key. 1.18
(. 1.2).
1.18.
<Page
...
>
380
1
<Page.Resources>
<Style TargetType="Button" x:Key="buttonStyle">
<Setter Property="FontSize" Value="48"/>
<Setter Property="Foreground">
<Setter.Value>
<SolidColorBrush Color="Yellow"/>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="Button"
BasedOn="{StaticResource buttonStyle}">
<Setter Property="Background" Value="Blue"/>
</Style>
</Page.Resources>
<Grid x:Name="ContentPanel"
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<StackPanel x:Name="LayoutRoot" Background="Transparent">
<Button Content=" 1"/>
<Button Content=" 2" Style="{x:Null}"/>
<Button Content=" 3"/>
</StackPanel>
</Grid>
</Page>
. 1.2.
,
, .
(Style="{x:Null}").
, , App.xaml.
( 1.19).
1.19. App.xaml
<Application
x:Class="XAMLApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
XAML
381
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XAMLApp">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<Style TargetType="Button" x:Key="buttonStyle">
<Setter Property="FontSize" Value="48"/>
<Setter Property="Foreground">
<Setter.Value>
<SolidColorBrush Color="Yellow"/>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="Button"
BasedOn="{StaticResource buttonStyle}">
<Setter Property="Background" Value="Blue"/>
</Style>
</ResourceDictionary>
<ResourceDictionary Source="Common/StandardStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
XAML-
. . 1.18
, 1.19 . , . 1.20
.
1.20.
<Button Content=" 4">
<Button.Resources>
<Style TargetType="Button">
<Setter Property="FontSize" Value="38"/>
<Setter Property="Foreground">
<Setter.Value>
<SolidColorBrush Color="Red"/>
</Setter.Value>
382
</Setter>
</Style>
</Button.Resources>
</Button>
App.xaml, .
XAML-, .
Styles.xaml Resource Dictionary
,
( 1.21).
1.21. Styles.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="Button" x:Key="buttonStyle">
<Setter Property="FontSize" Value="48"/>
<Setter Property="Foreground">
<Setter.Value>
<SolidColorBrush Color="Yellow"/>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="Button"
BasedOn="{StaticResource buttonStyle}">
<Setter Property="Background" Value="Blue"/>
</Style>
</ResourceDictionary>
App.xaml ( 1.22).
1.22.
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles.xaml"/>
<ResourceDictionary Source="Common/StandardStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
XAML
383
!
,
StandardStyles.xaml, .
, .
.
, , .
.
, ,
, Windows 8. ,
. . XAML .
1.23 (. 1.3).
1.23.
<Button Content="" Width="350" Height="100">
<Button.Template>
<ControlTemplate>
<Grid>
<Ellipse Stroke="{StaticResource
ApplicationForegroundThemeBrush}"
StrokeThickness="4" StrokeDashArray="4 2"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"/>
<ContentPresenter VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
ContentPresenter.
. 1.3.
384
,
, . .
1.23
. , .
VSM (Visual State Manager),
9.
, , XAML-
( 1.24), , .
1.24.
<Page
...
>
<Page.Resources>
<ControlTemplate x:Key="buttonTemplate" TargetType="Button">
<Grid>
<Ellipse Stroke="{StaticResource
ApplicationForegroundThemeBrush}"
StrokeThickness="4" StrokeDashArray="4 2"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"/>
<ContentPresenter VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Page.Resources>
<Grid x:Name="ContentPanel"
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Button Content="" Width="350" Height="100"
Template="{StaticResource buttonTemplate}"/>
</Grid>
</Page>
,
,
.
:
Canvas;
StackPanel;
Grid.
XAML
385
Canvas .
. Canvas (Attached Properties),
. Canvas.Top Button, Canvas.
(Button) Canvas , 1.25.
1.25. Canvas
<Canvas>
<Button Canvas.Top="75" Canvas.Left="75" Content=" T75.L75.Z-1"
Canvas.ZIndex="-1" FontSize="18" Width="200"
Height="75"
Background="Orange" />
<Button Canvas.Top="175" Canvas.Left="5" Content=" T175.L45"
FontSize="18"
Width="200"
Height="75" />
<Button Canvas.Top="110" Canvas.Left="90" Content=" T95.L90"
FontSize="18"
Width="220"
Height="75" />
</Canvas>
(. 1.4).
,
Canvas.
. 1.4. Canvas
386
!
, ZIndex, ,
.
Canvas ,
, , .
Canvas ,
Grid StackPanel. Canvas .
StackPanel , ( ). StackPanel
( 1.26).
1.26. StackPanel
<StackPanel>
<Button Margin="0,0,0,10" Content=" 0.0.0.10"
FontSize="18" Width="200" Height="75" />
<Button Content=" 0.0.0.0" FontSize="18"
Width="200" Height="75" />
<Button Margin="0,50,0,0" Content=" 0.50.0.0"
FontSize="18" Width="200" Height="75" />
<Button Margin="150,170,0,0" Content=" 150.170.0.0"
FontSize="18" Width="200" Height="75" />
</StackPanel>
Visual Studio, . Margin, .
StackPanel ,
. 1.5.
StackPanel ( 1.27).
1.27. StackPanel
<StackPanel Orientation="Horizontal">
<Button Margin="0,0,0,10" Content=" 0.0.0.10"
FontSize="18" Width="200" Height="75" />
<Button Content=" 0.0.0.0" FontSize="18"
Width="200" Height="75" />
XAML
387
, . 1.6.
. 1.5.
StackPanel
. 1.6. StackPanel ( )
Grid . Grid
. Grid , , ,
.
388
1.28.
1.28. Grid
<Grid Width="600" Height="600">
<Grid.RowDefinitions>
<RowDefinition Height="200"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Grid.Row="0" Content=" 0.0"
FontSize="18" Width="140" Height="75" />
<Button Grid.Column="2" Grid.Row="0" Content=" 2.0"
FontSize="18" Width="140" Height="75" />
<Button Grid.Column="1" Grid.Row="2" Content=" 1.2"
FontSize="18" Width="140" Height="75" />
</Grid>
!
, (Grid.Row) (Grid.Column) .
:
;
, (Auto);
(*).
, 200 ,
, , , .
. 1.7.
, Grid.RowSpan.
Grid.ColumnSpan. 1.29 , .
XAML
389
. 1.7. Grid
, . - . , . Binding.
, , ,
.
.
390
( 1.30).
1.30.
<StackPanel>
<Slider x:Name="slValue" />
<TextBox Text="{Binding Path=Value, ElementName=slValue}"/>
</StackPanel>
:
="{Binding ___}"
. 1.8.
, . ,
.
(Mode=TwoWay) ( 1.31).
1.31.
<StackPanel>
<Slider x:Name="slValue" />
<TextBox
Text="{Binding Path=Value, ElementName=slValue, Mode=TwoWay}" />
</StackPanel>
.
Path ( 1.32).
XAML
391
1.32. Path
<StackPanel>
<Slider x:Name="slValue" />
<TextBox Text="{Binding Value, ElementName=slValue, Mode=TwoWay}" />
</StackPanel>
1 100. , ,
1 40 , 40 80 , 80 100 .
(Background) , , . . , double. . , .
IValueConverter ( 1.33).
1.33.
public class DoubleToBrushConvertor : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, string language)
{
if (value is double)
{
var doubleVal = (double)value;
if (doubleVal < 40)
{
return new SolidColorBrush(Colors.Green);
}
if (doubleVal < 80)
{
return new SolidColorBrush(Colors.Yellow);
}
return new SolidColorBrush(Colors.Red);
}
return new SolidColorBrush(Colors.Transparent);
}
public object ConvertBack(object value, Type targetType,
object parameter, string language)
{
throw new NotImplementedException();
}
}
392
( 1.35).
1.35.
<StackPanel>
<Slider x:Name="slValue" />
<TextBox
Text="{Binding Value, ElementName=slValue, Mode=TwoWay}"
Background="{Binding Value,ElementName=slValue,
Converter={StaticResource doubleToBrushConvertor}}"/>
</StackPanel>
DataContext
- DataContext,
, DataContext. - .
, Person ( 1.36), (, e-mail).
1.36. Person
public class Person
{
public string LastName { get; set; }
public string FirstName { get; set; }
public string Email { get; set; }
}
XAML
393
( 1.37).
1.37.
<StackPanel x:Name="spPerson">
<TextBox Text="{Binding FirstName}"/>
<TextBox Text="{Binding LastName}"/>
<TextBox Text="{Binding Email}"/>
</StackPanel>
Person
StackPanel spPerson ( 1.38).
1.38. DataContext
Person person=new Person();
person.LastName = "";
person.FirstName = "";
person.Email = "ivan.ivanov@foo.com";
spPerson.DataContext = person;
spPerson
Person.
DataContext . ,
MVVM
(Model View ViewModel).
Person, . , Person .
,
INotifyPropertyChanged PropertyChanged ( 1.39).
1.39. INotifyPropertyChanged
public class Person : INotifyPropertyChanged
{
private string _lastName;
private string _firstName;
private string _email;
public string LastName
{
get { return _lastName; }
394
1
set
{
_lastName = value;
OnPropertyChanged("LastName");
}
}
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
OnPropertyChanged("FirstName");
}
}
public string Email
{
get { return _email; }
set
{
_email = value;
OnPropertyChanged("Email");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
var evt = PropertyChanged;
if (evt != null)
{
evt(this, new PropertyChangedEventArgs(propertyName));
}
}
, Person,
.
1.39 . ,
[CallerMemberName],
( ) ( 1.40).
XAML
1.40. [CallerMemberName]
public class Person : INotifyPropertyChanged
{
private string _lastName;
private string _firstName;
private string _email;
public string LastName
{
get { return _lastName; }
set { SetProperty(ref _lastName, value); }
}
public string FirstName
{
get { return _firstName; }
set { SetProperty(ref _firstName, value); }
}
public string Email
{
get { return _email; }
set { SetProperty(ref _email, value); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected bool SetProperty<T>(ref T storage, T value,
[CallerMemberName] String propertyName = null)
{
if (object.Equals(storage, value)) return false;
storage = value;
this.OnPropertyChanged(propertyName);
return true;
}
protected void OnPropertyChanged(
[CallerMemberName] string propertyName = null)
{
var eventHandler = this.PropertyChanged;
if (eventHandler != null)
{
eventHandler(this,
new PropertyChangedEventArgs(propertyName));
}
}
}
395
396
Person. ObservableCollection<T>, . . , (, List<T>), .
ObservableCollection<T>
. Person ( 1.41).
1.41.
public sealed partial class MainPage : Page
{
public ObservableCollection<Person> Persons { get; set; }
public MainPage()
{
this.InitializeComponent();
Persons = new ObservableCollection<Person>();
DataContext = this;
Person ivanov = new Person();
ivanov.LastName = "";
ivanov.FirstName = "";
ivanov.Email = "ivan.ivanov@foo.com";
Persons.Add(ivanov);
Person petrov = new Person();
petrov.LastName = "";
petrov.FirstName = "";
petrov.Email = "petr.petrov@foo.com";
Persons.Add(petrov);
Person sidorov = new Person();
sidorov.LastName = "";
sidorov.FirstName = "";
sidorov.Email = "sergey.sidorov@foo.com";
Persons.Add(sidorov);
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
}
XAML
397
( 1.42).
1.42.
<ListBox ItemsSource="{Binding Persons}">
</ListBox>
1.42 (ItemsSource)
ListBox Persons . MainPage, ListBox
Persons MainPage.
, ,
Person (. 1.9).
. 1.9. Person
398
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Person,
.
(. 1.10).
. 1.10. ListBox
XAML. ,
, . , .
XAML . ,
XAML- C# ( ,
C++ Visual Basic).
XAML-. , , XAML-
. , ,
.
poee2
C# 5
C#, ,
. ,
, .
, . Windows 8 Windows Runtime . , ,
(. 2.1).
. 2.1.
400
.
Microsoft , . , , Silverlight WebClient, http,
DownloadString, DownloadStringAsync
DownloadStringCompleted . , , ?
WebClient "" .
WPF- MainWindow.xaml ( 2.1).
2.1. XAML- MainWindow.xaml
<Window x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="600" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBox x:Name="txtResult"
Grid.Row="0" AcceptsReturn="True" Margin="10"/>
<Button Content=""
Grid.Row="1" Width="250" Margin="10" Click="Button_Click"/>
</Grid>
</Window>
http://akhmed.ru ( 2.2).
2.2. DownloadString
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var client = new WebClient();
txtResult.Text = client.DownloadString("http://akhmed.ru");
}
}
C# 5
401
?
. "" , .
? , , - ,
, (
).
, "" ? , , (Thread)
. WebClient
DownloadStringAsync,
( 2.3).
2.3.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
//private void Button_Click(object sender, RoutedEventArgs e)
//{
//
var client = new WebClient();
//
txtResult.Text = client.DownloadString("http://akhmed.ru");
//}
private void Button_Click(object sender, RoutedEventArgs e)
{
var client = new WebClient();
client.DownloadStringCompleted += ClientDownloadStringCompleted;
client.DownloadStringAsync(new Uri("http://akhmed.ru"));
}
void ClientDownloadStringCompleted(object sender,
DownloadStringCompletedEventArgs e)
{
txtResult.Text = e.Result;
}
}
, . ( 2.4).
402
2.4.
private void Button_Click(object sender, RoutedEventArgs e)
{
var client = new WebClient();
client.DownloadStringCompleted += (s, a) =>
{
txtResult.Text = a.Result;
};
client.DownloadStringAsync(new Uri("http://akhmed.ru"));
}
.
, . , http://habrahabr.ru, http://yandex.ru http://mail.ru
( 2.5).
2.5.
private void Button_Click(object sender, RoutedEventArgs e)
{
var summ = 0;
var client = new WebClient();
client.DownloadStringCompleted += (s1, a1) =>
{
summ += a1.Result.Length;
var client2 = new WebClient();
client2.DownloadStringCompleted += (s2, a2) =>
{
summ += a2.Result.Length;
var client3 = new WebClient();
client3.DownloadStringCompleted += (s3, a3) =>
{
summ += a3.Result.Length;
txtResult.Text = summ.ToString();
};
client3.DownloadStringAsync(new Uri("http://mail.ru"));
};
client2.DownloadStringAsync(new Uri("http://yandex.ru"));
};
client.DownloadStringAsync(new Uri("http://habrahabr.ru"));
}
C# 5
403
. - ,
if,
try/catch.
, ,
. , . ,
( 2.6).
2.6. 2.5
private void Button_Click(object sender, RoutedEventArgs e)
{
var summ = 0;
summ += GetLength("http://habr.ru");
summ += GetLength("http://yandex.ru");
summ += GetLength("http://mail.ru");
txtResult.Text = summ.ToString();
}
private int GetLength(string url)
{
return new WebClient().DownloadString(new Uri(url)).Length;
}
GetLength ,
. , try/catch.
async await
C# 5
async await C# 5
.
, WPF-
, .NET
Framework 4.5 ( 2.7).
Async Targeting Pack for Visual Studio 2012 async await Silverlight 5
.NET Framework 4.0.
404
2.7. WPF
private async void Button_Click(object sender, RoutedEventArgs e)
{
var client = new WebClient();
var uri = new Uri("http://akhmed.ru");
txtResult.Text = await client.DownloadStringTaskAsync(uri);
}
2.7 2.4 .
. , ,
: async await .
DownloadStringTaskAsync, Task<string>. (
await), .
async await Windows Store. Windows Store- , WPF .
, .
Windows 8
, .
, . , http Windows Store ( 2.8).
2.8. habr.ru WinRT
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
var client = new HttpClient();
txtResult.Text = await client.GetStringAsync("http://habr.ru");
}
}
, ? , async await.
C# 5
405
, async await,
Task Task<T>, .
GetStryngAsync Task<string>,
, string.
, Wait ( 2.9).
2.9.
private void Button_Click(object sender, RoutedEventArgs e)
{
var client = new HttpClient();
var task = client.GetStringAsync("http://habr.ru");
task.Wait();
txtResult.Text = task.Result;
}
, ,
"" , . -
await ( 2.8),
. Button_Click ,
. Button_Click,
await, .
.
.
async await, ( 2.10).
2.10.
private async void Button_Click(object sender, RoutedEventArgs e)
{
var contentHabrahabr = await new
HttpClient().GetStringAsync("http://habrahabr.ru");
var contentYandex = await new
HttpClient().GetStringAsync("http://yandex.ru");
var contentMail = await new
HttpClient().GetStringAsync("http://mail.ru");
var length = contentHabrahabr.Length + contentYandex.Length
+ contentMail.Length;
txtResult.Text = length.ToString();
}
406
, .
, .
Task . , , , . Task
WhenAll, ( 2.11).
2.11.
private async void Button_Click(object sender, RoutedEventArgs e)
{
var taskHabrahabr =
new HttpClient().GetStringAsync("http://habrahabr.ru");
var taskYandex = new HttpClient().GetStringAsync("http://yandex.ru");
var taskMail = new HttpClient().GetStringAsync("http://mail.ru");
await Task.WhenAll(taskHabrahabr, taskYandex, taskMail);
var length = taskHabrahabr.Result.Length
+ taskYandex.Result.Length
+ taskMail.Result.Length;
txtResult.Text = length.ToString();
}
. , . .
,
,
Task.Factory ( 2.12) ,
await.
2.12.
var txt = await Task<string>.Factory.StartNew(() =>
{
//
return "Hello World";
});
, . . ( ) Windows Store .
C# 5
407
A
Accelerometer 279
Animation Library 316
Application Bar 12, 18, 77
ApplicationLanguages 291
Assemblies 39
async 45, 403
Attached Properties 385
await 45, 403
B
BackgroundTaskBuilder 147
Badge 156
BadgeUpdateManager 173
Bauhaus 303
"Best at statement" 324
Binding 389
Blend for Visual Studio 27
C
CachedFileManager 233
CameraCaptureUI 245
Canvas 385
Charms 19, 347
Chrome 307
Clipboard 198
Compass 286
Culture 290
CultureInfo 290
CurrentApp 366
CurrentAppSimulator 366
D
DataTransferManager 196
Dependency Property 94
DeviceInformation 256
DLL- 142
DreamSpark 355
F
FileIO 219
FileOpenPicker 229
FileSavePicker 232
Filled 17, 125
Flyout 84
FolderPicker 233
Frame 59
Frameworks 39
Full Screen 16, 125
G
Geolocator 262
Global Position System, GPS 259
Grid 387
Gyrometer 282
I
i18n 289
In-App Purchases 355
Inclinometer 285
Information Architecture 304
International Typographic Style 23, 303
Internationalization 289
ItemTemplate 102
J
JSON 205
JsonObject 205
410
L
Language Integrated Quiries, LINQ 224
LayoutAwarePage 94, 130
LicenseInformation 366
LightSensor 276
Live ID 358
Live Tile 162
Lock Screen 143
M
MediaCapture 256
Microsoft Advertising 355
Motion Design 23, 303
MVVM 393
O
Object-Relational Mapping, ORM 224
P
Pivots 338
Pixels Per Inch, PPI 133
Popup 84, 213
PopupMenu 85
Push Notification 155
Push- 151
R
RandomAccessStreamReference 202
Raw 156
Remote Desktop 46
Resource leak 278
S
SampleDataSource 88
Sandbox 216
SearchPane 187
Secondary Tiles 20, 162, 177
Security Code 359
Semantic Zoom 115, 312, 334
Sensor Fusion 283
Settings 209
SettingsCommand 211
SettingsPane 209
Share 194
Sharing 318
SimpleOrientationSensor 287
Snapped 16, 125
Snapped Mode 338
Socket API 89
SQLite 221
SQL- 227
StackPanel 386
Storyboard 132
Suggestions 180
Swiss Design 303
SyndicationClient 89
T
Task 405
Task<T> 405
Tile 19, 156
TileUpdateManager 168
TileUpdater 166
Toast 156
Toast Notification 151
Trial 355
U
User Account Control, UAC 181
V
Visual State Manager, VSM 28, 132
Visual Studio 26
W
Windows App Certification Kit, WACK 364
Windows Push Notification Services, WNS
142, 156
Windows Runtime 15, 21
WinRT 21
WnsRecipe 161
WYSIWYG 40
X
XAML-
41
SecondPage.xaml 56
60
315
163
309
173, 174
290
103
- 366
24
25
301
303
338
173
304, 329
256
293
411
344
307
115, 312,
334
307, 344
181
348
347
290
291
31
289
356
384
Canvas 385
Grid 387
StackPanel 386
85, 345
347
256
308, 332
333
334
"" 313
307
318
83, 213
316, 338
"" 216
338
316, 338
177
166, 175
170
412
19
188
191
348
374
375
181
Filled 17
Full Screen 16
Snapped 16
121
115
115
162
16, 125
249
142
382
389
WNS 156
304
344
137
378
379
58
72
325
- 15
71
28, 70
24
198
144
145
151
155
158
359
Windows Store 32
251
250
FutureAccessList.Add 239
GetDefault() 279
PostToWns 159
405
"-" 19
(.)
32
163
102
384
305
143
321
413
SQL 221
292
301
315