これからはじめる xaml - wpf プログラミング

Post on 12-Apr-2017

1.306 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

これからはじめるXAML – WPFプログラミング

2

自己紹介 池原 大然

Microsoft MVP for Windows Platform Development

XAML スキー

Twitter ID: @Neri 78

インフラジスティックス・ジャパン株式会社

製品担当

Web: http://jp.infragistics.com

Email: dikehara@infragistics.com

3

セッション ゴール

XAML という言語に慣れる

データ コンテキストを利用した

データ バインディングの基礎を理解する

WPF をベースに XAML プラットフォームで

提供されているデータと UI の連携方法を

理解する

4

本日の内容 – WPF トレーニングからの抜粋

XAML を利用した UI 構築

データ コンテキストを利用したデータ バインディングの利用

データと UI の連携

まとめ:学習を進めるにあたって

XAML を利用したUI 構築

6

XAML とは?

XAML = Extensible Application Markup Language

XML を拡張したアプリケーション マークアップ言語

HTML に近く WPF では「宣言的」に UI を記述する言語として利用される

MSDN – 新井省三のBlog - XAML とは何か?http://blogs.msdn.com/b/shozoa/archive/2014/07/23/what-s-xaml.aspx

<Button VerticalAlignment="Center"FontSize="72"FontWeight="Bold"Content="ぽちっとな" />

7

XAML 構文 – 属性構文(プロパティ値)

属性名=“属性値” で指定

属性名: プロパティの CLR メンバ名

属性値: 引用符(“) で囲まれた [文字列 ]

<Button VerticalAlignment="Center"FontSize="72"FontWeight="Bold"Content="ぽちっとな" />

8

コンテンツ プロパティ属性

XAML では [ContentProperty] 属性に設定されている

プロパティへの値を直接定義できる

多くの場合 [Object 型] = コンテンツとして「なんでも」指定可能

<Button VerticalAlignment="Center"FontSize="72"FontWeight="Bold">

ぽちっとな</Button>

9

XAML 構文 – プロパティ要素構文 属性構文では表現できない場合に有用

<属性名>属性値</属性名>

先ほどの例と同じ意味を持つ

<Button VerticalAlignment="Center"FontSize="72"FontWeight="Bold">

<Button.Content>ぽちっとな

</Button.Content></Button>

10

複雑な要素の指定 コンテンツ プロパティ + プロパティ要素構文を利用することで複雑な UI を定義

<Button VerticalAlignment="Center“FontSize="72“FontWeight="Bold">

<StackPanel Orientation="Horizontal"><Image Width="128" Height="128“

Source="Images/MedicalBag128.png" /><TextBlock Text="ぽちっとな“

VerticalAlignment="Center" /></StackPanel>

</Button>

11

DEMOXAML におけるプロパティの設定と複雑な UI の構築

Q. 複数の

UI コントロールにデータを

渡すには?

13

画面仕様

1. 従業員の情報を出したい

2. 従業員が受け持っている顧客を

リストで表示したい

3. リストで選択された顧客に

紐づく受注情報を

テーブルで表示したい

14

A. データ コンテキスト

とデータ バインディング

データコンテキストを利用した

データ バインディング

16

データ コンテキストとは? FrameworkElement クラスで実装されているプロパティ

上位階層の DataContext から子階層の DataContext へ値を継承することができる

• 画面、あるいは領域に共通したデータを格納できる

(複数データも格納できる)

Window.DataContext=

“ぽちっとな”

上位階層のDataContext が継承されている

17

DEMODataContext の値の継承

18

値は継承できるが…

単純に値を変更しただけでは反映されない

• DataContext の値を変更• TextBlock.Text に再度反映

データ バインディングという仕組みで解決

19

データ バインディングの概念 データ バインディング

あるオブジェクトのプロパティ値 (ターゲット)と、

他のオブジェクト (ソース) を結びつける仕組み

一方が更新されたとき、

他方に更新された値を反映できる

(単方向、双方向)

XAML により宣言的なデータバインディングが可能

依存関係プロパティ システムを活用

TextBlock

TextProperty

Slider

DataContextBinding Object

ターゲット ソース

20

依存関係プロパティ 標準のプロパティを拡張した仕組み

• データバインディング(値の遅延評価と更新)

• スタイル(他者による値の変更)

• アニメーション(他者による値の継続的変化)

• 値の変更通知(コールバック機能)

• 既定値の適用

<Slider x:Name="slider1" /><TextBox x:Name="textBox1"

Text=“依存関係プロパティです” />

21

基本バインディング構文

例) スライダーで選択した値をテキストボックスに表示する

<Slider x:Name="slider1" /><TextBox x:Name="textBox1"

Text="{Binding ElementName=slider1, Path=Value}" />

TextBox.Text をターゲットとして、Slider1 という名前のオブジェクトを

ソースとしそのValue プロパティを バインディング

22

バインディングのソース

4 種類の指定方法TextBlock

TextProperty

TextBlock

DataContextBinding Object

Target Source

ソース 概要

ElementName ソース オブジェクト名が判明している場合に使用

Source ソース オブジェクトそのものを指定リソースとして宣言されているオブジェクトなどの指定に使用

RelativeSource ターゲットの位置に対して相対的な位置を指定自分自身や親要素、他の要素指定が可能

DataContext ターゲット自身の DataContext の値をソースに指定

23

データ コンテキスト バインディング

Window.DataContext=

“ぽちっとな”

上位階層のDataContext が継承されている

<TextBlock Name="tb1“Text="{Binding}" />

自身の DataContext の値をText プロパティに

バインディングWindow.DataContext の値が

かわると即時に反映される

24

DEMODataContext バインディングを利用した UI へのデータ表示

25

データの割り当てとバインディングSimpleDataClass

インスタンス

• StrValue = “ぽちっとな”

DataContext+

DataBinding画面に必要なデータ

エンドユーザーが変更したデータロジックで変更したデータ

これらを一元的に管理できる

+

UI を変更してもロジックに影響が出ない

26

参考: 複雑なコントロールであっても基本的な考え方は同じ

DataGrid にコレクションをバインドする

DataGridRow.DataContext に 1 行分のデータが割り当てられる

DataGridCell ではセルが属する列 に指定された Key 値に基づいて

1 行分のデータから列に対応する値がバインディングされる

OrderID OrderDate Sales

00114 6/2/2015 3:11: 28 AM 33445

00106 6/17/2015 3:11:28 AM 77289

データと UI の連携

28

画面仕様

1. 従業員の情報を出したい

2. 従業員が受け持っている顧客を

リストで表示したい

3. リストで選択された顧客に

紐づく受注情報を

テーブルで表示したい

29

それぞれの UI にデータを表示させる

1. TextBlock に従業員の情報

2. ListBox に従業員が

受け持っている顧客

3. DataGrid に ListBox で選択

された顧客に紐づく受注情報

TextBlock

TextBlock

ListBox DataGrid

30

画面に渡すデータ

Employee• EmployeeID• EmployeeName• Customers

(CustomerのコレクションList<Customer>)

Customer• CustomerID• CustomerName• Orders

(Order のコレクションList<Order>)

Order• OrderID• OrderDate• Sales

31

データ コンテキストを利用したデータの連携

Employee

Customerの

コレクション

Orderの

コレクション

Data

Conte

xt

のみで結合

32

DEMOデータ コンテキスト バインディングを利用したデータと UI の連携

33

データと UI の連携

保存すべきデータは全て データ コンテキスト プロパティに集約

データ コンテキスト バインディングを介して UI にデータを表示

目的に合わせて UI コントロールを変更

目的に合わせてテンプレート、スタイルをカスタマイズ

データ バインディングを利用することでユーザーの入力結果が

ダイレクトにデータに反映できる

ビジネスロジック部では入出力されたデータの管理や保存を行う

まとめ:学習を進めるにあたって

35

まずはここから:リソース

MSDN – WPF

https://msdn.microsoft.com/ja-jp/library/aa970268%28v=vs.110%29.aspx

荒井さんの Blog

http://blogs.msdn.com/b/shozoa/archive/2014/07/23/what-s-xaml.aspx

@IT – WPF入門http://www.atmarkit.co.jp/ait/subtop/features/dotnet/app/introwpf_index.html

Infragistics WPF コントロール

http://jp.infragistics.com/WPF

36

新しい言語パラダイム = 新要素

スタイル

テンプレート

データ テンプレート

ビヘイビアー

アクション

添付プロパティ

変更通知

テーマ

データ駆動、データ中心渡された「データ」を「どう表現するか」

を常に意識する

37

実開発で頻出の FAQ

ユーザー起点ではなく、ロジック起点でデータを更新し画面に反映するには?

バインディングにおいてデータを直接やりとりするのではなく、変換するには?

(0: 男性, 1:女性)

バインディングを利用した際にユーザーの入力を検証するには?

データと UI を分離したアプリケーションを構築する方法は?

画面の遷移方法は?その際の画面情報の受け渡しは?

Web サービスとの連携方法は?

コントロールの外観をカスタマイズする方法は?

役立つツール、ライブラリーは?

38

インフラジスティックスのサービス・製品

XAML トレーニング

一般的な XAML の知識から実践的なアプリケーション構築方法まで、

「これから」XAML を活用したアプリケーションを構築するための

ノウハウを共有

WPF をはじめとした UI コントロール

「どう表現するか」を予めデザインした UI を利用することで

「カスタマイズ」という手間を省く

Windows Forms ライクな開発手法にも対応

39

top related