publish/ MSPTutorial 応用編

67
応用編 Microsoft Student Partners 五十嵐 祐貴 2014/5/17 /publish// 1

description

//publish/のMSPによるハンズオンで使用したスライドです。 発展編のみを掲載しております。

Transcript of publish/ MSPTutorial 応用編

Page 1: publish/ MSPTutorial 応用編

応用編Microsoft Student Par tners

五十嵐 祐貴

2014/5/17 /publish// 1

Page 2: publish/ MSPTutorial 応用編

データバインディング

2014/5/17 /publish// 2

Page 3: publish/ MSPTutorial 応用編

データバインディングとはデータソースとビューを簡単に結びつける(同期する)ための仕組み

◦ コントロールのプロパティとインスタンスのプロパティ

◦ コントロールのプロパティとコントロールのプロパティ etc…

同期の方向も選べる◦ ソース → Target : OneTime

◦ ソースが変更されたとき(もしくは起動時)、1回のみターゲットプロパティを変更

◦ ソース⇒ターゲット : OneWay

◦ ソースプロパティが変更されたとき、ターゲットプロパティを変更(こちらは複数回可能)

◦ ソース⇔ターゲット : TwoWay

◦ ソースプロパティorターゲットプロパティが変更されたとき、ターゲットプロパティorソースプロパティを変更

2014/5/17 /publish// 3

Page 4: publish/ MSPTutorial 応用編

データバインディングとは今までの例

XAML

コード

実行結果

コントロールのプロパティに直接インスタンスを格納している

2014/5/17 /publish// 4

listView_Todo.Items.Add("ほげ");

listView_Todo.Items.Add("ふが");

<ListView x:Name="listView_Todo" />

要素

ほげ

ふが

Page 5: publish/ MSPTutorial 応用編

データバインディングとはデータバインディングを用いた例

XAML

コード

実行結果は同様

インスタンスはコード側が保持

2014/5/17 /publish// 5

<ListView x:Name="listView_Todo" ItemsSource="{Binding}" />

var foo = new

System.Collections.ObjectModel.ObservableCollection<string>();foo.Add("ほげ");

foo.Add("ふが");

foo.Add("ぴよ");

listView_Todo.DataContext = foo;

// listView_Todo.ItemsSource = foo;

Page 6: publish/ MSPTutorial 応用編

データバインディングとは今までの例

XAML

コード

実行結果

someTextBlockにlistView_Todoで選択している値が表示される

コントロールのプロパティとプロパティに関係を持たせる(ex.同期させる)場合、そのトリガーとしてイベントを使う必要がある

2014/5/17 /publish// 6

private void listView_Todo_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

if (listView_Todo.SelectedIndex > -1)

someTextBlock.Text = listView_Todo.Items[listView_Todo.SelectedIndex].ToString();

}

<ListView x:Name="listView_Todo"

SelectionChanged="listView_Todo_SelectionChanged"/>

<TextBlock x:Name=“someTextBlock" />

Page 7: publish/ MSPTutorial 応用編

データバインディングとはデータバインディングを用いた例

XAML

コード不要

実行結果は同様

Bindingのターゲットにはコントロールのプロパティも指定できるため、容易に関係を持たせることができる

この場合、同期の方向はOneWay(ListView⇒ TextBlock)であるため、ListViewで選択されている要素を変えれば、TextBlockの値も即時変更される

2014/5/17 /publish// 7

<ListView x:Name="listView_Todo" />

<TextBlock Text="{Binding

ElementName=listView_Todo,Path=SelectedItem}" />

Page 8: publish/ MSPTutorial 応用編

データバインディングの実装例ソースをバインディングに対応させる

◦ ソースのフィールドをプロパティに変更する

ソースの値が変更された際に更新(を通知)する必要がある場合、INotifyPropertyChangedインターフェイスを実装する

2014/5/17 /publish// 8

// TodoItem.csを編集

public class TodoItem

{

public string Name { get; set; }

public int Level { get; set; }

public DateTimeOffset PeriodTime { get; set; }(…後略…)

Page 9: publish/ MSPTutorial 応用編

データバインディングの実装例コード側にソースのインスタンスを保持する

List<T>でも出来るが、ObservableCollection<T>を使うと、要素の追加・削除も更新が通知される

2014/5/17 /publish// 9

// MainPage.xaml.csを編集using System.Collections.ObjectModel; // 先頭に追加

(…中略…)

public sealed partial class MainPage : Page

{

private ObservableCollection<string> todoCollection = new ObservableCollection<string>();(…後略…)

Page 10: publish/ MSPTutorial 応用編

データバインディングの実装例コントロールのDataContextにインスタンスをセットする

2014/5/17 /publish// 10

// MainPage.xaml.csを編集

public MainPage()

{

this.InitializeComponent();

App.Current.Suspending+=Current_Suspending;

App.Current.Resuming += Current_Resuming;(…中略…)

listView_Todo.DataContext = todoCollection; // 追加

}(…後略…)

Page 11: publish/ MSPTutorial 応用編

データバインディングの実装例ビューをBindingを用いて書き換える

コードを書き換える◦ 直接UIを操作するコードからモデルを操作するコードへ

以上で完成です。

動作確認をしてみましょう。

2014/5/17 /publish// 11

// MainPage.xamlを編集<ListView (…中略…) ItemsSource="{Binding}" />

// MainPage.xaml.csを編集

private void button_Add_Click(object sender, RoutedEventArgs e)

{

string name = textBox_Name.Text;

int level = int.Parse(comboBox_Level.SelectedItem.ToString());

DateTimeOffset period = datePicker_Period.Date;

TodoItem item = new TodoItem(name,level,period);

todoCollection.Add(item.ConvertTodoString());

}

Page 12: publish/ MSPTutorial 応用編

データバインディングおまけ編モデル、ビュー部分を以下のように書き換えることも可能

Converterを用いることでBindingの値を変更することも可能

2014/5/17 /publish// 12

private ObservableCollection<TodoItem> todoCollection = new ObservableCollection<TodoItem>();

<ListView (…中略…) ItemsSource=“{Binding}“ DisplayPath=“Name" />

private void button_Add_Click(object sender, RoutedEventArgs e)

{

string name = textBox_Name.Text;

int level = int.Parse(comboBox_Level.SelectedItem.ToString());

DateTimeOffset period = datePicker_Period.Date;

TodoItem item = new TodoItem(name,level,period);

todoCollection.Add(item);

}

Page 13: publish/ MSPTutorial 応用編

データバインディング参考リンク集データバインディング(WPF) - ++C++;// 未確認飛行 C

◦ http://ufcpp.net/study/dotnet/wpf_binding.html

連載:WPF入門:WPFの「データ・バインディング」を理解する - @IT

◦ http://www.atmarkit.co.jp/ait/articles/1010/08/news123.html

WindowsストアアプリプログラミングTips – garicchi.com

◦ http://garicchi.com/?page_id=111

2014/5/17 /publish// 13

Page 14: publish/ MSPTutorial 応用編

ストーリーボード

2014/5/17 /publish// 14

Page 15: publish/ MSPTutorial 応用編

ストーリーボードとはストアアプリではアニメーションを簡単に適用することができる

基本的に、1つのアニメーションは始点の値,終点の値,アニメーション時間で構成される

アニメーションごとの結びつき等、アニメーションのまとまりを表したものをストーリーボードと言う

2014/5/17 /publish// 15

Page 16: publish/ MSPTutorial 応用編

ストーリーボードの実装例例として、追加ボタンを押した際にIS12Tちゃんが震えるモーションを追加する

Visual Studioには非常に強力なUIデザインツール、Blendが付属

Blendを使えば、UIデザインを人手でコードを書かずスムーズに行える

今回はBlendを用いて作業を行っていく

2014/5/17 /publish// 16

Page 17: publish/ MSPTutorial 応用編

ストーリーボードの実装例MainPage.xamlを右クリックし、[Blendで開く]をクリック

Blendが起動する

2014/5/17 /publish// 17

Page 18: publish/ MSPTutorial 応用編

ストーリーボードの実装例Blendの画面

2014/5/17 /publish// 18

「オブジェクトとタイムライン」ウインドウ

プロパティウインドウ

Page 19: publish/ MSPTutorial 応用編

ストーリーボードの実装例オブジェクトとタイムラインウインドウの新規作成ボタンをクリック

今回は ItemAddStoryboardと入力(ここは任意の名前で良い)

OKをクリック

2014/5/17 /publish// 19

Page 20: publish/ MSPTutorial 応用編

ストーリーボードの実装例Blendが記録モードとなる

この時操作した内容が記録され、自動的にタイムラインに追加される

2014/5/17 /publish// 20

Page 21: publish/ MSPTutorial 応用編

ストーリーボードの実装例タイムラインウインドウの時間軸(黄色の線)が0:00.000(0.0秒)であることを確認

デザイナ、もしくはオブジェクトウインドウから Image コントロールが選択されていることを確認する

2014/5/17 /publish// 21

Page 22: publish/ MSPTutorial 応用編

ストーリーボードの実装例Blend右側のプロパティウインドウにある変換グループの回転プロパティのZの値の右側にある□をクリックし、現在地の記録をクリック

2014/5/17 /publish// 22

Page 23: publish/ MSPTutorial 応用編

ストーリーボードの実装例タイムラインウインドウの時間軸(黄色の線)を0:00.200(0.2秒)へ移動(ドラッグ)

デザイナ、もしくはオブジェクトウインドウから Image コントロールが選択されていることを確認する

2014/5/17 /publish// 23

Page 24: publish/ MSPTutorial 応用編

ストーリーボードの実装例タイムラインウインドウの0.0sの箇所にひし形の点が打たれている

これはキーフレームと呼ばれる、アニメーションの始点や終点時のプロパティの値を記録しておくもの

2014/5/17 /publish// 24

Page 25: publish/ MSPTutorial 応用編

ストーリーボードの実装例Blend右側のプロパティウインドウにある変換グループの回転プロパティのZの値を20に変更しEnterキーを押す(もしくは現在値の記録)

デザイナのIS12Tちゃんも変更されていることが確認できる

2014/5/17 /publish// 25

Page 26: publish/ MSPTutorial 応用編

ストーリーボードの実装例タイムラインウインドウの0.0s~0.2sまでに線が引かれる

始点と終点のキーフレームが指定され、アニメーションが発生した

基本的に間の値は補間される

2014/5/17 /publish// 26

Page 27: publish/ MSPTutorial 応用編

ストーリーボードの実装例同様に、タイムラインウインドウの時間軸を0:00.400(0.4秒)へ移動(ドラッグ)

Imageが選択されているかを確認し、回転のZプロパティの値を -20に変更

2014/5/17 /publish// 27

Page 28: publish/ MSPTutorial 応用編

ストーリーボードの実装例さらに同様に、タイムラインウインドウの時間軸を0:00.600(0.6秒)へ移動(ドラッグ)

Imageが選択されているかを確認し、回転のZプロパティの値を 0に変更

2014/5/17 /publish// 28

Page 29: publish/ MSPTutorial 応用編

ストーリーボードの実装例タイムラインに4つのキーフレームが打たれている

動作確認のため、再生ボタンを押す

⇒ IS12Tちゃんが動けばOK

2014/5/17 /publish// 29

Page 30: publish/ MSPTutorial 応用編

ストーリーボードの実装例動きが少々ぎこちない

キーフレームの間の値は補間される

補間のされ方(値の変わり方)を表す関数をEasing Functionと呼ぶ

Easing Functionを変更してみよう

2014/5/17 /publish// 30

Page 31: publish/ MSPTutorial 応用編

ストーリーボードの実装例オブジェクトとタイムラインウインドウ内にあるImageの左側の▷をクリックし展開する

展開されて出てきた要素 Projection をクリック

2014/5/17 /publish// 31

Page 32: publish/ MSPTutorial 応用編

ストーリーボードの実装例プロパティウインドウからEasing Functionを選択できる

好きなものを選びましょう (例: Bounce InOut)

2014/5/17 /publish// 32

Page 33: publish/ MSPTutorial 応用編

ストーリーボードの実装例一通り操作が終わったら、記録を停止するため、デザイナ左上の赤いボタンをクリック

ファイル → すべて保存をクリックした後、Blendを終了させる

2014/5/17 /publish// 33

Page 34: publish/ MSPTutorial 応用編

ストーリーボードの実装例Visual Studioに戻ると、以下のような画面が表示される場合がある

その場合はすべてに適用をクリックする

2014/5/17 /publish// 34

Page 35: publish/ MSPTutorial 応用編

ストーリーボードの実装例MainPage.xaml.csのbutton_Addをクリックしたときのイベントハンドラに追記する

以上で完了です。

動作確認をしてみましょう

2014/5/17 /publish// 35

// MainPage.xaml.csを編集

private void button_Add_Click(object sender, RoutedEventArgs e)

{(…中略…)

ItemAddStoryboard.Begin(); // この行を追加

}

Page 36: publish/ MSPTutorial 応用編

コントロールテンプレート

2014/5/17 /publish// 36

Page 37: publish/ MSPTutorial 応用編

コントロールテンプレートとはコントロールに対して適用する(UIの構成も含めた)スタイルを定義するもの

コントロール自体の形や動作(例:ボタンが押された時のアクション)も変更することが出来る

定義したテンプレートを参照させることで、変更を最小限にできる

ストアアプリの強力な”スタイルシート”

複雑なスタイルも定義することが出来る

2014/5/17 /publish// 37

Page 38: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例MainPage.xamlを右クリックし、[Blendで開く]をクリック

Blendが起動する

2014/5/17 /publish// 38

Page 39: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例button_Add(“追加”ボタン)をオブジェクトとタイムラインウインドウで選択

右クリックし、テンプレートの編集からコピーとして編集をクリックする

2014/5/17 /publish// 39

Page 40: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例Styleリソースの作成画面が表示される

名前には適当な文字列(ここではRadiusButtonStyleとする)を入力する

以上でbutton_Addをベースとしたテンプレートが作成される

2014/5/17 /publish// 40

Page 41: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例Blendがテンプレートの編集画面となる

Blendの上部に階層リンクバーが表示されていることが確認できる

2014/5/17 /publish// 41

Page 42: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例テンプレートとして設定したい項目を、左側のオブジェクトとタイムラインウインドウ、右側のプロパティウインドウを用いて設定していく

今回は角丸スタイルを設定するため、オブジェクトとタイムラインウインドウからBorderを選択

2014/5/17 /publish// 42

Page 43: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例今回は角丸スタイルを設定するため、CornerRadiusを10とした

プロパティの値を変更すると、デザイナーにも即時反映される

2014/5/17 /publish// 43

Page 44: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例オブジェクトとタイムラインウインドウのテンプレート名(今回は

RadiusButton)の左側にあるボタンをクリックする

以上でテンプレートの編集が終わり、元の画面に戻る

2014/5/17 /publish// 44

Page 45: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例作成したテンプレートを他のボタンにも適用させましょう

button_Deleteを右クリック

テンプレートの編集のリソースの適用

作成したテンプレートを選択する

同様にしてbutton_hushigiにも適用する

2014/5/17 /publish// 45

Page 46: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例すべてのボタンが角丸になったことが確認できる

2014/5/17 /publish// 46

Page 47: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例では、RadiusButtonスタイルを変更してみましょう

リソースウインドウ(初期設定ではプロパティウインドウと同じウインドウグループ)の[Page]を展開する

RadiusButtonの右側にあるリソースの編集ボタンをクリック

2014/5/17 /publish// 47

Page 48: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例先ほどと同じテンプレートの編集画面に移動する

同様にして、プロパティウインドウを用いて編集できる

2014/5/17 /publish// 48

Page 49: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例変化をわかりやすくするため、Buttonを180度回転させる

テンプレートに変更を適用する

2014/5/17 /publish// 49

Page 50: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例RadiusButtonを適用したすべてのボタンが180度回転している

同じ作業を繰り返してボタンの回転を取り消し(0度にする)、修正が適用されたか確認してみましょう

2014/5/17 /publish// 50

Page 51: publish/ MSPTutorial 応用編

ストーリーボードの実装例全ての操作が終わったら、ファイル → すべて保存をクリックした後、

Blendを終了させる

Visual Studioに戻ると、以下のような画面が表示される場合がある

その場合はすべてに適用をクリックする

2014/5/17 /publish// 51

Page 52: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例おまけ

表示メニューから分割ビューを選択すると、Blendによって生成されたXAMLを確認することができます。

自動生成されたXAMLがどのようなことを行っているのか確認してみましょう

2014/5/17 /publish// 52

Page 53: publish/ MSPTutorial 応用編

コントロールテンプレートの実装例おまけ

XAMLを確認すると、ControlTemplateとStyleの両方が含まれていることが確認できる。余裕があれば自動生成されたXAMLの意味を考えてみましょう

2014/5/17 /publish// 53

<Style x:Key="RadiusButtonStyle" TargetType="Button"><Setter Property=“Background” Value=“{ThemeResource ButtonBackgroundThemeBrush}”/> // プロパティの値の変更を行う箇所

(…中略…)

<Setter Property="Template">

<Setter.Value><ControlTemplate TargetType=“Button”> // ControlTemplateを定義する箇所

<Grid> // ベースとなるコントロールとしてGridを用いている<VisualStateManager.VisualStateGroups> // クリックされた等の状態でのスタイルを定義する場所

<VisualStateGroup x:Name="CommonStates"><VisualState x:Name=“Normal”/> // それぞれの状態の定義を行う場所

<VisualState x:Name="PointerOver">(…中略…)

</VisualStateGroup>

</VisualStateManager.VisualStateGroups>

<Border x:Name="Border" BorderBrush=" {TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"

Margin="3" CornerRadius="10">

</Border>

</Grid>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

Page 54: publish/ MSPTutorial 応用編

Azure Mobile Service

2014/5/17 /publish// 54

Page 55: publish/ MSPTutorial 応用編

Azure Mobile Serviceの実装例Microsoft Azureポータル ( https://manage.windowsazure.com/ )に移動する

左下の新規ボタンをクリックし、コンピューティング、モバイルサービス、作成の順にクリックする

2014/5/17 /publish// 55

Page 56: publish/ MSPTutorial 応用編

Azure Mobile Serviceの実装例モバイルサービスの作成画面が表示されるので、画面の指示にしたがって作成する

今回はデータベースも利用する

入力が終わったら右下の矢印ボタンをクリックする

2014/5/17 /publish// 56

Page 57: publish/ MSPTutorial 応用編

Azure Mobile Serviceの実装例データベースを作成する場合、次の画面でデータベースの設定画面が表示される

入力が終わったら右下の完了ボタンをクリックする

2014/5/17 /publish// 57

Page 58: publish/ MSPTutorial 応用編

Azure Mobile Serviceの実装例ステータスバーに以下のような表示が現れたらモバイルサービスの構築は完了

作成したモバイルサービス名をクリックする

2014/5/17 /publish// 58

Page 59: publish/ MSPTutorial 応用編

Azure Mobile Serviceの実装例プラットフォームの選択からWindowsストアをクリックし、既存の

WINDOWSストアアプリに接続するをクリックする

2014/5/17 /publish// 59

Page 60: publish/ MSPTutorial 応用編

Azure Mobile Serviceの実装例画面の表示に沿って進めていきましょう

プロジェクトを右クリックし、NuGetパッケージの管理をクリックする

2014/5/17 /publish// 60

Page 61: publish/ MSPTutorial 応用編

Azure Mobile Serviceの実装例検索ボックスにWindowsAzure.MobileServicesと入力し、Windows

Azure Mobile Servicesをインストールする

2014/5/17 /publish// 61

Page 62: publish/ MSPTutorial 応用編

Azure Mobile Serviceの実装例インストールが終了したらApp.xaml.csを開き、先ほど表示された手順1を実行する

以下に例を示す

2014/5/17 /publish// 62

using Microsoft.WindowsAzure.MobileServices;(…中略…)

namespace SampleTodoApp

{

sealed partial class App : Application

{

public static MobileServiceClient MobileService = new MobileServiceClient(

"https://mspsample.azure-mobile.net/",

“AAAAAAAAAAAAAAAAAAAAAAA"

);(…後略…)

Page 63: publish/ MSPTutorial 応用編

Azure Mobile Serviceの実装例データを追加した時、データを削除した時にモバイルサービスを更新するコードを追加する

2014/5/17 /publish// 63

private async void button_Add_Click(object sender, RoutedEventArgs e)// button_Addをクリックした時のイベントハンドラ

{(…中略…)

await App.MobileService.GetTable<TodoItem>().InsertAsync(item); //MobileServiceに追加

}

(…前略…)

await App.MobileService.GetTable<TodoItem>().DeleteAsync(item); //MobileServiceから削除

Page 64: publish/ MSPTutorial 応用編

Azure Mobile Serviceの実装例MainPageをロードした際に、Mobile Serviceからデータを取得しUIを更新するコードを追加する

2014/5/17 /publish// 64

(…前略…)

todoCollection = await App.MobileService.GetTable<TodoItem>(). .ToCollectionAsync();

Page 65: publish/ MSPTutorial 応用編

Azure Mobile Serviceのサンプル新しいWINDOWSストアアプリを作成するをクリックすると、ストアアプリのサンプルがダウンロードできる

2014/5/17 /publish// 65

Page 66: publish/ MSPTutorial 応用編

Azure Mobile Service参考リンク集MicrosoftAzureMobileService入門 – garicchi.com

◦ http://garicchi.com/?page_id=8131

第1回 Windows Azureモバイルサービスの基礎 –技術評論社

◦ http://gihyo.jp/dev/serial/01/wams/0001

2014/5/17 /publish// 66

Page 67: publish/ MSPTutorial 応用編

2014/5/17 /publish// 67