WPFのアーキテクチャ
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-[[戻る>WPF]]
* 目次 [#n83520fb]
#contents
*概要 [#q1a484b6]
-MSDN > WPFの基礎 > WPFアーキテクチャ~
http://msdn.microsoft.com/ja-jp/library/ms750441.aspx
*クラス階層 [#b319c3db]
System.Object
-System.Threading.DispatcherObject
-System.Windows.DependencyObject
-System.Windows.Media.Visual
-System.Windows.UIElement
-System.Windows.FrameworkElement
-System.Windows.Controls.Control
-System.Windows.Controls.ContentControl
-System.Windows.Controls.ItemsControl
**System.Object [#d4af4c32]
http://msdn.microsoft.com/ja-jp/library/system.object.aspx
***マネージ [#ze383efe]
-WPFのプログラミング モデルを提供するフレームワークは、CL...
-マネージ コンポーネントには、開発の生産性と信頼性を高め...
***アンマネージ [#sb885689]
これに対し、アンマネージ コンポーネント(milcore.dll)は...
-メモリと実行の細かい制御も、WPF に対する要件の 1 つ。
-DirectXとの緊密な統合の実現するため。~
ハードウェア レンダリングおよびソフトウェア レンダリング...
WPF での表示はすべて DirectX エンジンによって実行されるよ...
**System.Threading.DispatcherObject [#y115b7e3]
http://msdn.microsoft.com/ja-jp/library/system.windows.th...
DispatcherObjectは、派生したCLRオブジェクトに、[[STA]]オ...
通常、WPFアプリケーションは、
-レンダリング スレッド:レンダリングを処理するスレッド
-UIスレッド:アプリケーションの主スレッド(イベント処理、...
の2つのスレッドを使用して実行される。
「UIスレッド」と「レンダリング スレッド」の関係は、
-「レンダリング スレッド」は、「UIスレッド」がユーザ入力...
イベント処理・UI処理をしている間に、バック グラウンドで実...
-このため、ほとんどのWPFアプリケーションは、単一の「UIス...
状況によっては、応答性を高める目的でバック グラウンド ス...
-WPFでは、バック グラウンド処理の実装を支援するDispatcher...
***WPFのスレッド モデル [#u9f30894]
-MSDN > WPFの基礎 > スレッド モデル~
http://msdn.microsoft.com/ja-jp/library/ms741870.aspx
-DispatcherObject.Invoke、BeginInvokeメソッドを使用するこ...
バック グラウンド処理からの「UI変更処理」(= UI要素の操...
--MSDNマガジン > 発行物 > WPFのスレッド:Dispatcherを使用...
http://msdn.microsoft.com/ja-jp/magazine/cc163328.aspx
--MSDN > .NET Frameworkクラス ライブラリ
---System.Windows.Threading.Dispatcher.Invokeメソッド~
http://msdn.microsoft.com/ja-jp/library/system.windows.th...
>このメソッドに指定されたデリゲートは、同期実行されるため...
---System.Windows.Threading.Dispatcher.BeginInvokeメソッド~
http://msdn.microsoft.com/ja-jp/library/system.windows.th...
---System.Windows.Threading.DispatcherPriority列挙体~
http://msdn.microsoft.com/ja-jp/library/system.windows.th...
-Invoke、BeginInvokeのメソッドは、
--内部的には([[STA]]と同様にスレッド間通信の手段である)...
--エンキューされた「UI変更処理」は、「UIスレッド」がアイ...
-これにより、
--「UI変更処理」は、必ず、特定の「UIスレッド」により処理...
--マルチ スレッド処理においてスレッド セーフではないUIコ...
**System.Windows.DependencyObject [#ie0208ee]
http://msdn.microsoft.com/ja-jp/library/system.windows.de...
***「[[WPFプロパティ システム>#u00b87e5]]」 [#pc8cfb2f]
DependencyObjectは、派生したCLRオブジェクトに「[[WPFプロ...
-WPFのアーキテクチャの理念は、「メソッドやイベント(コー...
-これを実現する「[[WPFプロパティ システム>#u00b87e5]]」を...
***「[[依存関係プロパティ>#y0f446a9]]」 [#dcf9d94b]
このためWPFの開発元は、このXAMLのマークアップによる宣言的...
-「[[依存関係プロパティ>#y0f446a9]]」は、プロパティの依存...
-具体的には、ソースとなるオブジェクトのプロパティの変更が...
(必須ではないが、INotifyPropertyChangedインターフェイス...
ターゲットとなるオブジェクトのプロパティ値を自動的に検証...
--MSDN > .NET Frameworkクラス ライブラリ~
System.ComponentModel.INotifyPropertyChangedインターフェ...
http://msdn.microsoft.com/ja-jp/library/system.componentm...
-「[[依存関係プロパティ>#y0f446a9]]」の入力には、次のもの...
--動的な「リソース」
---「スタイル」
---「テンプレート」
---「アニメーション」
--「データ バインディング」
---「ビュー・モデル オブジェクト」
--「添付プロパティ」~
親子要素のリレーションの値(子要素 → 親要素)を設定する。
--「プロパティ値の継承」~
親子要素のリレーションの値(親要素 → 子要素)を設定する。
**System.Windows.Media.Visual [#s4219d62]
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
***Visualによる描画のサポート [#b50ecf0e]
Visualは、WPF の中心的な機能である描画をサポートする基本...
Visualは、マネージ コンポーネントとアンマネージ コンポー...
-Visualで定義されているマネージ データ(描画情報、描画方...
-「ビジュアル ツリー」(後述)と呼ばれるツリー構造のアン...
-これを「レンダリング スレッド」がツリー構造の上から下に...
これによって、描画内容をレンダリングする。
***レンダリングの概要 [#i7053a56]
-WPF グラフィックス レンダリングの概要~
http://msdn.microsoft.com/ja-jp/library/ms748373.aspx
-出力表示 : 描画内容をレンダリングする。
--クリッピング : CGで、画像の一部を切り抜く。
--変換 : 変換(回転、拡大縮小、傾斜、平行移動)を実行する。
--境界の計算 : ビジュアルの外接する四角形を決定する。
--ヒット テスト : 境界に含まれているかどうかを判定する。
-プロパティの例
--VisualOpacity : 不透明度~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--VisualOpacityMask : 不透明マスク~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--VisualClip : クリッピング(クリップ領域の決定)~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--VisualTransform : 変換(ビジュアルの変換値)~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--VisualEdgemode : 端の描画方法~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
-Visualオブジェクトの階層構造
┬Visual
├UIElement
│└FrameworkElement
├ContainerVisual
│├DrawingVisual
│├HostVisual
└Viewport3DVisual
--System.Windows.Media.ContainerVisualクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
Visualオブジェクトのコレクションのコンテナとして使用され...
--System.Windows.Media.DrawingVisualクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
---図形(ベクタ グラフィックス)、イメージ、モニター(ビ...
---レイアウトやイベントの処理を実現しないため軽量で、背景...
---また、ContainerVisualクラスから派生するため、Visualオ...
--System.Windows.Media.Media3D.Viewport3DVisualクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
---2DのVisualオブジェクトとVisual3Dオブジェクト間のブリッ...
---Viewport3DVisualでは、Cameraプロパティ(シーンを表示)...
-Visualオブジェクトの描画コンテンツ
--Visualオブジェクトは、描画コンテンツを格納した下記の4...
--また、命令リストを表すオブジェクトとして、DrawingGroup...
--なお、Drawingクラスは基本抽象クラスであり、描画コンテン...
---描画コンテンツ:ベクタ グラフィックス、イメージ、モニ...
---派生クラス:GeometryDrawing 、ImageDrawing 、VideoDraw...
--System.Windows.Media.Drawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.DrawingGroupクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.GeometryDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.ImageDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.VideoDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.GlyphRunDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
-MSDN > Windows Presentation Foundation > グラフィックス...
--Drawingオブジェクトの概要~
http://msdn.microsoft.com/ja-jp/library/ms751619.aspx
--方法:GeometryDrawingを作成する~
http://msdn.microsoft.com/ja-jp/library/ms742533.aspx
--方法:ImageDrawingを使用してイメージを描画する~
http://msdn.microsoft.com/ja-jp/library/ms753315.aspx
--方法:VideoDrawingを使用してメディアを再生する~
http://msdn.microsoft.com/ja-jp/library/aa969812.aspx
-Visualオブジェクトの命令リスト
|項番|命令リスト|説明|h
|1|ベクタ グラフィックス&br;(GeometryDrawing)|Geometry...
|2|イメージ&br;(ImageDrawing)|デジタル メディア ファイ...
|3|モニター&br;(VideoDrawing)|デジタル メディア ファイ...
|4|グリフ&br;(GlyphRunDrawing)|テキストとフォントで表...
--System.Windows.Media.Geometryクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.Penクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.Brushクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
-レンダリング データのレンダリング~
Visualオブジェクトの描画コンテンツであるベクタ グラフィッ...
--DrawingVisual・DrawingImage オブジェクトのDrawingプロパ...
--もしくはDrawingオブジェクトのPen・Brushプロパティ
>として表される。
>なお、
--DrawingVisual・DrawingGroupオブジェクトに、DrawingGroup...
--DrawingImageオブジェクトにDrawingGroup、Drawingオブジェ...
--DrawingVisual・DrawingImageオブジェクトが「レンダリング...
DrawingGroupオブジェクトは、自身に設定されているプロパテ...
+Children
+OpacityMask
+Opacity
+BitmapEffect
+ClipGeometry
+GuidelineSet
+Transform
**System.Windows.UIElement [#de06b271]
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
UIElementは、WPFコア レベル実装の基本クラス
***目的 [#t187a88c]
UIElementは、WPFコア レベル実装の基本クラスで、下記を目的...
-派生クラスで、オーバーライドする仮想メソッドを公開する。
-派生クラスで、仮想メソッドをオーバーライドすることによっ...
--「レイアウト」
--「ルーティング イベント」
-自要素と子要素の「レイアウト」を操作する。
-キーボード、マウス、およびスタイラスなどによる入力操作に~
対する「ルーティング イベント」と、関連するプロパティが含...
***機能 [#beb7a80f]
-子要素の「レイアウト」(サイズ指定・配置)
-ユーザ入力への応答、「ルーティング イベント」
-「アニメーション」システムを部分的にサポート
***プロパティの例 [#ad49dd69]
-IsEnabled : UI要素の有効・無効~
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
-Visibility : UI要素の可視性~
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
-AllowDrop : D&Dの有効・無効~
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
-Focusable : フォーカスの有効・無効~
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
-RenderTransform : 変換(アニメーションや一時効果の追加)~
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
**System.Windows.FrameworkElement [#ed372988]
http://msdn.microsoft.com/ja-jp/library/system.windows.fr...
UIElementに、「レイアウト」、「スタイル」を中心とした機能...
***概要 [#e5e82b73]
FrameworkElementは、UIElementの仮想メンバへ、以下を導入す...
-ポリシー・カスタマイズの導入
--「レイアウト」
--動的「リソース」
--「スタイル」~
「テンプレート」は、FrameworkElementではなく、コントロー...
--「アニメーション」~
アニメーションは、 UIElementで定義されているが、Framework...
FrameworkElement.BeginStoryboardメソッドと、その関連メン...
--「データ バインディング」
-新しいサブシステムの導入
***機能 [#f8d915d0]
-追加の「レイアウト」特性の定義
-動的「リソース」
--「スタイル」のサポート
--「アニメーション」のサポートの強化
-「データ バインディング」
***プロパティの例 [#ga6ec042]
-Style : 使用されるスタイル~
http://msdn.microsoft.com/ja-jp/library/system.windows.fr...
-UseLayoutRounding : サイズと位置の丸め要・否~
http://msdn.microsoft.com/ja-jp/library/system.windows.fr...
-LayoutTransform : 変換(回転、拡大縮小、傾斜、平行移動)~
http://msdn.microsoft.com/ja-jp/library/system.windows.fr...
**System.Windows.Controls.Control [#p2c5df5e]
http://msdn.microsoft.com/ja-jp/library/system.windows.co...
「テンプレート」を使用して外観を定義する UI 要素の基本ク...
Controlの最も重要な機能は、「テンプレート」である。
この「テンプレート」により、
-コントロールの「外観」を宣言型マークアップでカスタマイズ...
-また、「イベント ハンドラ」や「イベント トリガ」などもこ...
「テンプレート」を「スタイル」化することで、任意の型のコ...
**System.Windows.Controls.ContentControl [#e85cfa8d]
http://msdn.microsoft.com/ja-jp/library/system.windows.co...
-ContentControl は、Contentプロパティを持つコントロールで...
-Contentプロパティには、文字列に限らず、様々な子要素を1つ...
--代表的なContentControl型の(ContentControlクラスから派...
--なお、プロパティへ子要素を設定するXAML構文を、
---「プロパティ属性構文」
---「プロパティ要素構文」
>>と呼び、この中で、特にContentプロパティに子要素を設定す...
-ContentControlも、Contentプロパティの表示に特化した「テ...
**System.Windows.Controls.ItemsControl [#j79a4288]
-ItemsControlは、1つのコンテンツを設定するContentControl...
複数のコンテンツを設定できるItemsコレクション プロパティ...
-Itemsコレクション プロパティには、様々な子要素を複数設定...
--代表的なItemsControl型の(ItemsControlクラスから派生し...
ComboBox、ListBox、TabControl、TreeViewなどがある。
--なお、同様にItemsコレクション プロパティに子要素を設定...
-ItemsControlも、Itemsコレクション プロパティの表示に特化...
*要素ツリー [#p05c4c4f]
WPFは、ビジュアル要素や、CLRオブジェクトによる「要素ツリ...
「要素ツリー」は、XAMLやプログラムにより、構築される。
-MSDN > Windows Presentation Foundation > 方法 : 要素を...
http://msdn.microsoft.com/ja-jp/library/ms752374.aspx
例えばXAMLは、次の「プロパティ要素構文」の暗黙的、または...
-DockPanel.Children(Panel.Children)プロパティ
-ListBox.Items(ItemsControl.Items)プロパティ
<DockPanel>
<!--implicit: <DockPanel.Children>--> → プロパティ要素...
<ListBox DockPanel.Dock="Top">
<!--implicit: <ListBox.Items>--> → プロパティ要素構...
<ListBoxItem>
<TextBlock>Dog</TextBlock>
</ListBoxItem>
<ListBoxItem>
<TextBlock>Cat</TextBlock>
</ListBoxItem>
<ListBoxItem>
<TextBlock>Fish</TextBlock>
</ListBoxItem>
<!--implicit: </ListBox.Items>--> → プロパティ要素構...
</ListBox>
<Button Height="20" Width="100" DockPanel.Dock="Top">B...
<!--implicit: </DockPanel.Children>--> → プロパティ要...
</DockPanel>
-ただし、「要素ツリー」は、実体そのものではない「メタファ...
-これは、WPFのUIサブシステムのアーキテクチャ、UIフレーム...
-「要素ツリー」には、「論理ツリー」・「ビジュアル ツリー...
--MSDN > WPFの基礎 > WPFのツリー~
http://msdn.microsoft.com/ja-jp/library/ms753391.aspx
**論理ツリー [#ofdb8805]
「論理ツリー」は、CLRオブジェクトの要素のツリーを表し、「...
以下のXAMLとコードは、同じ「論理ツリー」(CLRオブジェクト...
***XAML [#a1a94e7f]
<DockPanel>
<ListBox Width="100">
<ListBoxItem>Dog</ListBoxItem>
<ListBoxItem>Cat</ListBoxItem>
<ListBoxItem>Fish</ListBoxItem>
</ListBox>
<Button Click="OnClick">OK</Button>
</DockPanel>
***コードビハインド [#qf0ea5dd]
DockPanel dp = new DockPanel();
ListBox lbx = new ListBox();
lbx.Width = 100;
ListBoxItem lbxItem = null;
lbxItem = new ListBoxItem();
lbxItem.Content = "Dog";
lbx.Items.Add(lbxItem);
lbxItem = new ListBoxItem();
lbxItem.Content = "Cat";
lbx.Items.Add(lbxItem);
lbxItem = new ListBoxItem();
lbxItem.Content = "Fish";
lbx.Items.Add(lbxItem);
dp.Children.Add(lbx);
Button btn = new Button();
btn.Content = "OK";
btn.Click += new RoutedEventHandler(this.OnClick);
dp.Children.Add(btn);
this.AddChild(dp);
**ビジュアル ツリー [#o813f26f]
「ビジュアル ツリー」は、「論理ツリー」と異なり、ビジュア...
このため、アプリケーションのUIで使用する、全てのVisualオ...
***レンダリング順序 [#f42d2e01]
「ビジュアル ツリー」階層の最上位の要素(ルート ビジュア...
***ルート ビジュアル [#ca4aa149]
ルート ビジュアルは、「ビジュアル ツリー」階層の最上位の...
--Window : 「Window画面」
--NavigationWindow : 「ナビゲーション フレームワーク」
--Win32アプリケーションにホストされる場合、Win32ウィンド...
>MSDN > Windows Presentation Foundation > チュートリアル:~
Win32アプリケーションでのビジュアル オブジェクトのホスト~
http://msdn.microsoft.com/ja-jp/library/ms754039.aspx
**論理ツリーと、ビジュアル ツリーの確認方法 [#k6ab5976]
実際に、「要素ツリー」の内容を確認したい場合は、以下のヘ...
-LogicalTreeHelper:「論理ツリー」の子要素を照会~
http://msdn.microsoft.com/ja-jp/library/system.windows.lo...
-VisualTreeHelper:「ビジュアル ツリー」の子要素を照会~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
上記のヘルパ クラスの使用例を、サンプルコードとして以下に...
***LogicalTreeHelper [#e72a4ad7]
LogicalTreeHelperを使用する場合は、以下のPrintLogicalTree...
private void PrintLogicalTree() {
Debug.WriteLine("PrintLogicalTree");
PrintLogicalTree(0, this);
}
// 論理ツリーを出力する。
// DependencyObjectの場合は、子要素も再帰的に表示する
private void PrintLogicalTree(int level, DependencyObjec...
PrintObject(level, obj);
foreach (var child in LogicalTreeHelper.GetChildren(ob...
if (child is DependencyObject) {
PrintLogicalTree(level + 1, (DependencyObject)chil...
}
else {
PrintObject(level + 1, child);
}
}
}
***VisualTreeHelper [#k7112a97]
VisualTreeHelperを使用する場合は、以下のPrintVisualTreeメ...
private void PrintVisualTree() {
Debug.WriteLine("PrintVisualTree");
PrintVisualTree(0, this);
}
// ビジュアル ツリーを表示する。
// DependencyObjectの場合はビジュアル ツリー上の子要素も...
private void PrintVisualTree(int level, DependencyObject...
PrintObject(level, obj);
foreach (var child in GetVisualChildren(obj)) {
if (child is DependencyObject) {
PrintVisualTree(level + 1, (DependencyObject)child);
}
else {
PrintObject(level + 1, child);
}
}
}
// ビジュアル ツリーの子要素の列挙を返す
private IEnumerable<object> GetVisualChildren(Dependency...
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(...
yield return VisualTreeHelper.GetChild(obj, i);
}
}
***共通 [#lbeaa2bd]
結果をインデントつきで出力
// ToStringの結果をインデントつきで出力
private void PrintObject(int level, object obj) {
Debug.WriteLine(new string('\t', level) + obj);
}
*WPFプロパティ システム [#u00b87e5]
本項では、DependencyObjectにより実装される「WPFプロパティ...
-「依存関係プロパティ」
-「添付プロパティ」
-「プロパティ値の継承」
について説明する。
なお、それぞれのプロパティの定義方法などについても触れる...
-MSDN > Windows Presentation Foundation~
コントロール > コントロールのカスタマイズ > コントロール...
http://msdn.microsoft.com/ja-jp/library/ms745025.aspx
**依存関係プロパティ [#y0f446a9]
「依存関係プロパティ」は、「WPFプロパティ システム」によ...
「依存関係プロパティ」では、変更監視・有効値検証などの機...
-MSDN > WPFの基礎 > プロパティ > 依存関係プロパティの概要~
http://msdn.microsoft.com/ja-jp/library/ms752914.aspx
***用途 [#y018495e]
「依存関係プロパティ」は、下記で使用されている。
-動的な「リソース」参照
--「スタイル」
--「アニメーション」
-「データ バインディング」
-「添付プロパティ」
-「プロパティ値の継承」
***定義 [#a9c8a7fa]
「依存関係プロパティ」は、一般的なプロパティであるCLRプロ...
-定義方法~
以下、「依存関係プロパティ」の定義方法について説明する。
--public static readonly(VBでは、Public Shared ReadOnly...
--「依存関係プロパティ」名の末尾に「Property」を付与する...
--変数宣言時か、静的コンストラクタを初期化する。~
DependencyProperty.Register メソッドを使用し「依存関係プ...
http://msdn.microsoft.com/ja-jp/library/system.windows.de...
--「依存関係プロパティ」は、プロパティの設定・取得方法が...
CLRプロパティでラップし、プロパティにアクセスし易いように...
-実装例~
以下、「依存関係プロパティ」の定義の実装例を示す。
// 依存関係プロパティを実装するクラス
public class ConcreteDependencyObject : DependencyObject {
// 依存関係プロパティ
public static readonly DependencyProperty CaptionPrope...
// 静的コンストラクタ
static ConcreteDependencyObject(){
// 静的コンストラクタで依存関係プロパティを登録
CaptionProperty = DependencyProperty.Register(
"Caption", // プロパティ名
typeof(string), // プロパティの型
typeof(ConcreteDependencyObject), // プロパティの...
new PropertyMetadata()); // 各種メタデータ
}
// 依存関係プロパティは設定・取得方法が特殊であるので、
// 以下のように、CLRプロパティでラップする。
public string Caption {
get { return this.GetValue(ConcreteDependencyObject....
set { this.SetValue(ConcreteDependencyObject.Caption...
}
}
-MSDN > WPFの基礎 > プロパティ
--カスタム依存関係プロパティ~
http://msdn.microsoft.com/ja-jp/library/ms753358.aspx
--XAML読み込みと依存関係プロパティ~
http://msdn.microsoft.com/ja-jp/library/bb613563.aspx
***機能 [#accfccff]
「依存関係プロパティ」では、以下のような機能が使用可能に...
-プロパティの既定値の設定
-ソース プロパティの変更監視コールバックの設定
-プロパティ値の強制コールバックの設定
-プロパティ値の有効値検証コールバックの設定
なお、以下それぞれの機能の説明と、DependencyProperty.Regi...
-プロパティの既定値の設定~
プロパティの既定値を設定する。
new PropertyMetadata("DefaultValue")
--MSDN > .NET Frameworkクラス ライブラリ > System.Windows...
http://msdn.microsoft.com/ja-jp/library/system.windows.pr...
-ソース プロパティの変更監視コールバックの設定~
「依存関係プロパティ」が、有効なプロパティ値に変更された...
例えば、値を「最小値 ~ 最大値の間に強制する」などの用途...
new PropertyMetadata("DefaultValue",
new PropertyChangedCallback(OnPropertyChangedCallback))
// プロパティ値の変更監視コールバック
private static void OnPropertyChangedCallback(
DependencyObject d, DependencyPropertyChangedEventArgs...
// プロパティ値の変更監視の例:
string oldValue = (string)e.OldValue;
string newValue = (string)e.NewValue;
DependencyProperty dp = e.Property;
}
--MSDN > .NET Frameworkクラス ライブラリ > System.Windows...
http://msdn.microsoft.com/ja-jp/library/system.windows.pr...
-プロパティ値の強制コールバックの設定~
「依存関係プロパティ」の値が再評価されたり、強制が明示的...
new PropertyMetadata("DefaultValue",
new PropertyChangedCallback(OnPropertyChangedCallback),
new CoerceValueCallback(OnCoerceValueCallBack))
// 依存関係プロパティ値の強制コールバック
private static object OnCoerceValueCallBack(DependencyOb...
// プロパティ値の強制の例:
// Captionプロパティ値に「"ChangeValue"」が設定されな...
// Captionプロパティ値は「"DefaultValue"」を強制する。
if (value.ToString() == "ChangeValue") return value;
return "DefaultValue";
}
--MSDN > .NET Frameworkクラス ライブラリ > System.Windows...
http://msdn.microsoft.com/ja-jp/library/system.windows.co...
-プロパティ値の有効値検証コールバックの設定~
「依存関係プロパティ」の値が再評価された際、有効値を検証...
new PropertyMetadata("DefaultValue",
new PropertyChangedCallback(OnPropertyChangedCallback),
new CoerceValueCallback(OnCoerceValueCallBack),
new ValidateValueCallback(OnValidateValueCallback));
// プロパティ値の有効値検証コールバック
private static bool OnValidateValueCallback(object value...
// プロパティ値の有効値検証の例:
// Captionプロパティ値に「" DengerousValue "」が設定さ...
if (value.ToString() == "DengerousValue") return false;
return true;
}
--MSDN > .NET Frameworkクラス ライブラリ > System.Windows...
http://msdn.microsoft.com/ja-jp/library/system.windows.va...
**添付プロパティ [#bb2645d8]
「添付プロパティ」は、「WPFプロパティ システム」によって...
-MSDN > WPFの基礎 > プロパティ > 添付プロパティの概要~
http://msdn.microsoft.com/ja-jp/library/ms749011.aspx
***用途 [#c7733074]
-「添付プロパティ」は、親要素で定義されるプロパティに対し...
子要素がそれぞれ別の値を指定するなど、任意のオブジェクト...
-「添付プロパティ」の代表的な使用例には、~
「パネル要素」などの子要素を格納する親要素が、子要素のレ...
-ここでは、
--親要素として、Canvas要素
--子要素として、TextBlock要素
>を例に挙げて説明する。
>TextBlockのレイアウトを制御するため、
-TextBlockに(仮に)CanvasTop、CanvasLeftプロパティを持た...
-TextBlockが、Canvas要素の子要素ではない場合、
>無駄なプロパティとデータを持つことになる。
>この問題を解決するため、「添付プロパティ」は、親要素が子...
以下は、レイアウトを制御するCanvas要素の「添付プロパティ...
<Canvas>
<TextBlock Canvas.Top="10" Canvas.Left="20">
Hello World!
</TextBlock>
</Canvas>
>子要素から親要素への「添付プロパティ」設定の際、内部的に...
***定義 [#a8cf6d48]
「添付プロパティ」を定義する場合は、「依存関係プロパティ...
-DependencyProperty.Registerメソッドではなく、
-DependencyProperty.RegisterAttached メソッドを使用し
「添付プロパティ」として登録する。
-MSDN > WPFの基礎 > プロパティ > 方法:添付プロパティを登...
http://msdn.microsoft.com/ja-jp/library/ms753957.aspx
--MSDN > .NET Frameworkクラス ライブラリ > System.Windows...
http://msdn.microsoft.com/ja-jp/library/system.windows.de...
また、「添付プロパティ」はCLRプロパティ ラッパではなく、
-Get(プロパティ名)
-Set(プロパティ名)
の名称付与基準に従った、専用の静的 get、setアクセッサ メ...
public static void Setプロパティ変数名(UIElement element...
element.SetValue(this.プロパティ変数, value);
}
public static Boolean Getプロパティ変数名(UIElement elem...
return (Boolean)element.GetValue(this.プロパティ変数);
}
これらのアクセッサ メソッドは、XAMLリーダが「添付プロパテ...
コードビハインドから、これらのアクセッサ メソッドを使用し...
<Canvas x:Name="myCanvas">
</Canvas>
TextBlock textBlock = new TextBlock();
textBlock.Text = "Hello World!";
// 添付プロパティを設定
Canvas.SetTop(textBlock, 10);
Canvas.SetLeft(textBlock, 20);
this.myCanvas.Children.Add(textBlock);
**プロパティ継承(包含継承) [#qaec881f]
-「WPFプロパティ システム」では、包含継承(HTMLコードと同...
HTMLでは、例えば、body要素に対してstyle属性やfont属性でフ...
※ 注:オブジェクト指向プログラミングにおける継承(派生ク...
-これを実現するのが「プロパティ値の継承」の機能である。
--「プロパティ値の継承」がされる一部のプロパティは、「要...
--この動作は、子要素から親要素のプロパティを設定する「添...
「プロパティ値の継承」の仕組みも、「添付プロパティ」と同...
(そのため、「添付プロパティ」と同様、プロパティの登録にD...
-MSDN > WPFの基礎 > プロパティ > プロパティ値の継承~
http://msdn.microsoft.com/ja-jp/library/ms753197.aspx
***用途 [#g25b76d5]
-包含継承の機能は、親要素、例えば、ルート要素(Window or ...
一度だけ定義することで、画面全体のポリシーを統一するよう...
-「プロパティ値の継承」がされるプロパティの一例として、以...
--Control.FontSizeプロパティ
--FrameworkElement.FlowDirectionプロパティ.etc
***定義 [#w433fade]
DependencyProperty.RegisterAttachedメソッドの第4引数に指...
-MSDN > WPFの基礎 > プロパティ > プロパティ値の継承 - カ...
http://msdn.microsoft.com/ja-jp/library/ms753197.aspx#Mak...
なお、「プロパティ値の継承」のブロッキング境界として、Fra...
*データ バインディング [#dac6f2bf]
WPFでは、
-ビュー(XAML:データの表示)と
-モデル(コードビハインド:チェック処理や、データアクセス...
を分離するための仕組みとして、「データ バインディング」と...
-連載 WPF/Silverlight UIフレームワーク入門:~
第2回 データの表示と入力に必要な知識 (1/5) - @IT~
http://www.atmarkit.co.jp/ait/articles/0905/19/news145.html
***「依存関係プロパティ」との関係 [#k47c9306]
これには、前述の「依存関係プロパティ」を使用している。
-「データ バインディング」を利用すれば、
--ビューとモデルの接点を、任意のプロパティ接続だけに限定...
--このため、ビューの内部にビューとモデルを接続するロジッ...
ビュー内のコード量を削減すると同時に疎結合を実現できる。
-「データ バインディング」により、~
2つのオブジェクトを結合するが、通常、
--ビュー側のXAMLで生成されたCLRオブジェクトを「バインディ...
--モデル側のコードビハインドで生成されたCLRオブジェクトを...
>と呼ぶ。
***「バインディング ターゲット」と「バインディング ソース...
この2つのオブジェクトを結合するためにBinding オブジェク...
-なお、
--「バインディング ターゲット」に入力されたデータや、
--「バインディング ソース」の更新通知によるデータの、
>妥当性検証の機能は、(継承する)~
「WPFプロパティ システム」を実装するDependencyObjectによ...
-また、この「バインディング ソース」からの更新通知の機能...
(実装する)INotifyPropertyChangedインターフェイスにより...
それぞれ、これに合わせた実装が必要になる。
**データ バインディングの構成要素 [#c9b8331b]
このため、「データ バインディング」の機能は、~
以下の3つの要素によって提供されると言って良い。
-DependencyObjectオブジェクト
-INotifyPropertyChanged インターフェイス
-Bindingオブジェクト
***DependencyObjectオブジェクト [#s6d62344]
ビュー側「バインディング ターゲット」のDependencyObjectオ...
-System.Windows.DependencyObjectクラス~
https://msdn.microsoft.com/ja-jp/library/system.windows.d...
***INotifyPropertyChanged インターフェイス [#t5dbd931]
モデル側「バインディング ソース」のINotifyPropertyChanged...
-System.ComponentModel.INotifyPropertyChangedインターフェ...
http://msdn.microsoft.com/ja-jp/library/system.componentm...
***Bindingオブジェクト [#c6e05036]
上記2つの要素を結び付けるBindingオブジェクト
-System.Windows.Data.Bindingクラス~
https://msdn.microsoft.com/ja-jp/library/system.windows.d...
**「データ バインディング」のプロパティ [#y87c2f7b]
Bindingクラスが持つ主要なプロパティ
|項番|プロパティ|説明|h
|1|Mode|データが反映される方向を、以下の列挙型から選択し...
|2|Source|「バインディング ソース」を指定する。|
|3|Path|「バインディング ソース」のプロパティ名を指定す...
**XAMLで「データ バインディング」を実装 [#db619849]
「データ バインディング」は、XAML上の要素のプロパティ値と...
「{Binding ・・・}」という記述を使用してBindingオブジェクト...
**DataContextの使用 [#v92c0074]
-MSDN > .NET Frameworkクラス ライブラリ > FrameworkElemen...
http://msdn.microsoft.com/ja-jp/library/system.windows.fr...
-「バインディング ソース」と「バインディング ターゲット」...
Bindingオブジェクトの規定のターゲットであるDataContextプ...
-「データ バインディング」では、「バインディング ターゲッ...
このため、FrameworkElement.DataContextプロパティに、任意...
-なお、DataContextプロパティは、「プロパティ値の継承」に...
このため、指定した「バインディング ソース」は、親要素から...
親要素(もしくは自身)のDataContextプロパティに「バインデ...
**型変換(値コンバータ) [#w78d8241]
-「データ バインディング」では、
--「バインディング ターゲット」と
--「バインディング ソース」で
>プロパティ型が異なる場合、暗黙的な型変換が行われる。
-型変換の動作のカスタマイズの必要性
--暗黙の型変換が失敗する場合
--入力数値から背景色を変更するような処理を実装したい場合。
-型変換の動作のカスタマイズの実装
--暗黙の型変換(または値変換)が失敗する場合、nullが返さ...
この対応としてIValueConverter インターフェイスを実装した~
「値コンバータ」を実装することで明示的な型変換(または値...
--なお、「値コンバータ」で型変換できない場合も同様に、nul...
nullが返された場合、通常は何も表示されないが、これをカス...
Binding.TargetNullValueプロパティを実装し、ソース値が nul...
**色々なデータ バインディングのパターン [#p660eac3]
***(1)コードビハインドからの単方向のデータ バインディ...
-コードビハインドからのデータ バインディング~
「データ バインディング」の基本的な動作を理解するために、~
Bindingオブジェクトをコードビハインドで自作し、~
「バインディング ソース」と「バインディング ターゲット」を~
OneWayモードで結び付け、「データ バインディング」を行う。
--連載 WPF/Silverlight UIフレームワーク入門:第2回 デー...
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_02/ui...
-「バインディング ソース」にDataContextを使用して、~
「バインディング ソース」と「バインディング ターゲット」を~
OneWayモードで結び付け、「データ バインディング」を行う。
--連載 WPF/Silverlight UIフレームワーク入門:第2回 デー...
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_02/ui...
***(2)変更通知の追加(入力値の自動計算アプリケーション...
-(1)に以下を加えて、入力値の自動計算アプリケーションを...
--(1)と同じ、OneWayモードで結び付け、「データ バインデ...
--OneWayToSourceモードで結び付け、「データ バインディング...
--変更通知を追加し、計算された値を「バインディング ターゲ...
-変更通知を追加方法
--OneWay の「バインディング ソース」には、INotifyProperty...
--なお、UI要素の表示に関するプロパティは、基本的に「依存...
-連載 WPF/Silverlight UIフレームワーク入門:第2回 デー...
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_02/ui...
***(3)双方向のデータ バインディング(TextBoxとSliderの...
TwoWayモードで結び付け、「データ バインディング」を行う。
***(4)値コンバータの使用 [#nf7e2b6a]
以下に値コンバータを適用できる。
-OneWayモードを使用した「データ バインディング」~
TwoWayモードに対応した「値コンバータ」は、Convertメソッド...
-OneWayToSourceモードを併用した「データ バインディング」~
TwoWayモードに対応した「値コンバータ」は、ConvertBackメソ...
-TwoWayモードを使用した「データ バインディング」~
TwoWayモードに対応した「値コンバータ」は、Convert、Conver...
***(5)ItemsSourceへのデータ バインディング [#v1655e1f]
-ItemsSourceへのデータ バインディング~
ItemsControlから派生した要素のItemsSource属性にコレクショ...
-インデクサによるデータ バインディング~
DataGridの列にDataTableの指定の列をデータバインディングす...
XAMLの「バインディングのマークアップ拡張」にて、Bindingプ...
Path属性に角括弧を指定することで、インデクサを使用して接...
*ルーティング イベント [#m1474b2f]
イベントを生成したUIコントロール上だけでなく、「ビジュア...
例えば、Buttonコントロールが「テンプレート」を使用し、複...
下位のコントロールのイベントを上位のButtonコントロールで...
-MSDN > WPFの基礎 > イベント(WPF) > ルーティング イベン...
http://msdn.microsoft.com/ja-jp/library/ms742806.aspx
**ルーティング方法 [#jd3aaeae]
「ルーティング イベント」は、3つのルーティング方法のいず...
|項番|区分|機能|h
|1|トンネル|ツリーを下方向へ辿る。&br;最初に、「ビジュア...
|2|バブル|ツリーを上方向へ辿る。&br;最初に、イベントを発...
|3|直接|イベントを発生させた要素のみに、イベント ハンド...
-MSDN > WPFの基礎 > イベント~
ルーティング イベントの処理済みとしてのマーキング、および...
http://msdn.microsoft.com/ja-jp/library/ms747183.aspx
多くの場合、WPF から提供される入力イベントは、「トンネル ...
**通常の使い方 [#oc007e5d]
イベントを発生元の要素で処理する限り、「ルーティング イベ...
これは、「ルーティング イベント」は、
-共通ハンドラを定義する場合や、
-カスタム コントロールを複合化する場合などの、
「特定のシナリオ」で効果を発揮するためである。
例えば、以下は、Buttonコントロールのイベントを発生元の要...
この場合、WPFのデザイナにButtonコントロールをD & Dし、こ...
***XAML [#ef18a848]
<Grid>
<Button Height="23" Name="button1" Click="button1_Clic...
</Grid>
***コードビハインド [#b20f01bd]
public partial class Window1 : Window {
public Window1() {
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventA...
// button1_Click
}
}
**イベントの追加方法 [#o2b73970]
***XAML [#f9a9eb48]
XAMLでは、イベント リスナである要素の属性にイベント ハン...
「型コンバータ」により、イベント ハンドラを設定できる。~
上記のClick="button1_Click"が、それに該当する。
-コードビハインド~
なお、イベントの指定をXAMLの「型コンバータ」からではなく...
次の2種類の方法(メソッド、演算子)で行うことができる。
--UIElement.AddHandlerメソッドを利用する場合:
this.button1.AddHandler(Button.ClickEvent, new RoutedEve...
--オーバーロードされた演算子を利用する場合:
this.button1.Click += new RoutedEventHandler(button1_Cli...
**サンプル [#m7ba51ae]
下記のXAMLは、
-「トンネル ルーティング イベント」:PreviewMouseDownイベ...
-「バブル ルーティング イベント」:MouseDownイベント
の動作を確認するためのサンプル。
***論理ツリー [#v1d8321f]
StackPanel - Border - Rectangle
***XAML [#t063843b]
<StackPanel x:Name="stackPanel1"
Height="100" Width="100" Orientation="Vertical"
MouseDown="stackPanel1_MouseDown"
PreviewMouseDown="stackPanel1_PreviewMouseDown">
<Border x:Name="border1"
MouseDown="border1_MouseDown"
PreviewMouseDown="border1_PreviewMouseDown">
<Rectangle x:Name="rect1"
Height="100" Width="100" Fill="Black"
MouseDown="rect1_MouseDown"
PreviewMouseDown="rect1_PreviewMouseDown">
</Rectangle>
</Border>
</StackPanel>
***コードビハインド [#cd8a9d19]
/// <summary>stackPanel1のMouseDownイベント</summary>
private void stackPanel1_MouseDown(object sender, MouseE...
System.Diagnostics.Debug.WriteLine("→ stackPanel1_Mous...
}
/// <summary>stackPanel1のPreviewMouseDownイベント</summ...
private void stackPanel1_PreviewMouseDown(object sender,...
System.Diagnostics.Debug.WriteLine("→ stackPanel1_Prev...
}
/// <summary>border1のMouseDownイベント</summary>
private void border1_MouseDown(object sender, MouseEvent...
System.Diagnostics.Debug.WriteLine("→ border1_MouseDow...
}
/// <summary>border1のPreviewMouseDownイベント</summary>
private void border1_PreviewMouseDown(object sender, Mou...
System.Diagnostics.Debug.WriteLine("→ border1_PreviewM...
}
/// <summary>rect1のMouseDownイベント</summary>
private void rect1_MouseDown(object sender, MouseEventAr...
System.Diagnostics.Debug.WriteLine("→ rect1_MouseDown");
}
/// <summary>rect1のPreviewMouseDownイベント</summary>
private void rect1_PreviewMouseDown(object sender, Mouse...
System.Diagnostics.Debug.WriteLine("→ rect1_PreviewMou...
}
このコードを実装して、画面上のRectangleをクリックすると、...
stackPanel1_PreviewMouseDown
→ border1_PreviewMouseDown
→ rect1_PreviewMouseDown
→ rect1_MouseDown
→ border1_MouseDown
→ stackPanel1_MouseDown
なお、各イベント ハンドラで「e.Handled = true」を実行する...
----
Tags: [[:.NET開発]], [[:UIサブシステム]], [[:WPF/Silverli...
終了行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-[[戻る>WPF]]
* 目次 [#n83520fb]
#contents
*概要 [#q1a484b6]
-MSDN > WPFの基礎 > WPFアーキテクチャ~
http://msdn.microsoft.com/ja-jp/library/ms750441.aspx
*クラス階層 [#b319c3db]
System.Object
-System.Threading.DispatcherObject
-System.Windows.DependencyObject
-System.Windows.Media.Visual
-System.Windows.UIElement
-System.Windows.FrameworkElement
-System.Windows.Controls.Control
-System.Windows.Controls.ContentControl
-System.Windows.Controls.ItemsControl
**System.Object [#d4af4c32]
http://msdn.microsoft.com/ja-jp/library/system.object.aspx
***マネージ [#ze383efe]
-WPFのプログラミング モデルを提供するフレームワークは、CL...
-マネージ コンポーネントには、開発の生産性と信頼性を高め...
***アンマネージ [#sb885689]
これに対し、アンマネージ コンポーネント(milcore.dll)は...
-メモリと実行の細かい制御も、WPF に対する要件の 1 つ。
-DirectXとの緊密な統合の実現するため。~
ハードウェア レンダリングおよびソフトウェア レンダリング...
WPF での表示はすべて DirectX エンジンによって実行されるよ...
**System.Threading.DispatcherObject [#y115b7e3]
http://msdn.microsoft.com/ja-jp/library/system.windows.th...
DispatcherObjectは、派生したCLRオブジェクトに、[[STA]]オ...
通常、WPFアプリケーションは、
-レンダリング スレッド:レンダリングを処理するスレッド
-UIスレッド:アプリケーションの主スレッド(イベント処理、...
の2つのスレッドを使用して実行される。
「UIスレッド」と「レンダリング スレッド」の関係は、
-「レンダリング スレッド」は、「UIスレッド」がユーザ入力...
イベント処理・UI処理をしている間に、バック グラウンドで実...
-このため、ほとんどのWPFアプリケーションは、単一の「UIス...
状況によっては、応答性を高める目的でバック グラウンド ス...
-WPFでは、バック グラウンド処理の実装を支援するDispatcher...
***WPFのスレッド モデル [#u9f30894]
-MSDN > WPFの基礎 > スレッド モデル~
http://msdn.microsoft.com/ja-jp/library/ms741870.aspx
-DispatcherObject.Invoke、BeginInvokeメソッドを使用するこ...
バック グラウンド処理からの「UI変更処理」(= UI要素の操...
--MSDNマガジン > 発行物 > WPFのスレッド:Dispatcherを使用...
http://msdn.microsoft.com/ja-jp/magazine/cc163328.aspx
--MSDN > .NET Frameworkクラス ライブラリ
---System.Windows.Threading.Dispatcher.Invokeメソッド~
http://msdn.microsoft.com/ja-jp/library/system.windows.th...
>このメソッドに指定されたデリゲートは、同期実行されるため...
---System.Windows.Threading.Dispatcher.BeginInvokeメソッド~
http://msdn.microsoft.com/ja-jp/library/system.windows.th...
---System.Windows.Threading.DispatcherPriority列挙体~
http://msdn.microsoft.com/ja-jp/library/system.windows.th...
-Invoke、BeginInvokeのメソッドは、
--内部的には([[STA]]と同様にスレッド間通信の手段である)...
--エンキューされた「UI変更処理」は、「UIスレッド」がアイ...
-これにより、
--「UI変更処理」は、必ず、特定の「UIスレッド」により処理...
--マルチ スレッド処理においてスレッド セーフではないUIコ...
**System.Windows.DependencyObject [#ie0208ee]
http://msdn.microsoft.com/ja-jp/library/system.windows.de...
***「[[WPFプロパティ システム>#u00b87e5]]」 [#pc8cfb2f]
DependencyObjectは、派生したCLRオブジェクトに「[[WPFプロ...
-WPFのアーキテクチャの理念は、「メソッドやイベント(コー...
-これを実現する「[[WPFプロパティ システム>#u00b87e5]]」を...
***「[[依存関係プロパティ>#y0f446a9]]」 [#dcf9d94b]
このためWPFの開発元は、このXAMLのマークアップによる宣言的...
-「[[依存関係プロパティ>#y0f446a9]]」は、プロパティの依存...
-具体的には、ソースとなるオブジェクトのプロパティの変更が...
(必須ではないが、INotifyPropertyChangedインターフェイス...
ターゲットとなるオブジェクトのプロパティ値を自動的に検証...
--MSDN > .NET Frameworkクラス ライブラリ~
System.ComponentModel.INotifyPropertyChangedインターフェ...
http://msdn.microsoft.com/ja-jp/library/system.componentm...
-「[[依存関係プロパティ>#y0f446a9]]」の入力には、次のもの...
--動的な「リソース」
---「スタイル」
---「テンプレート」
---「アニメーション」
--「データ バインディング」
---「ビュー・モデル オブジェクト」
--「添付プロパティ」~
親子要素のリレーションの値(子要素 → 親要素)を設定する。
--「プロパティ値の継承」~
親子要素のリレーションの値(親要素 → 子要素)を設定する。
**System.Windows.Media.Visual [#s4219d62]
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
***Visualによる描画のサポート [#b50ecf0e]
Visualは、WPF の中心的な機能である描画をサポートする基本...
Visualは、マネージ コンポーネントとアンマネージ コンポー...
-Visualで定義されているマネージ データ(描画情報、描画方...
-「ビジュアル ツリー」(後述)と呼ばれるツリー構造のアン...
-これを「レンダリング スレッド」がツリー構造の上から下に...
これによって、描画内容をレンダリングする。
***レンダリングの概要 [#i7053a56]
-WPF グラフィックス レンダリングの概要~
http://msdn.microsoft.com/ja-jp/library/ms748373.aspx
-出力表示 : 描画内容をレンダリングする。
--クリッピング : CGで、画像の一部を切り抜く。
--変換 : 変換(回転、拡大縮小、傾斜、平行移動)を実行する。
--境界の計算 : ビジュアルの外接する四角形を決定する。
--ヒット テスト : 境界に含まれているかどうかを判定する。
-プロパティの例
--VisualOpacity : 不透明度~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--VisualOpacityMask : 不透明マスク~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--VisualClip : クリッピング(クリップ領域の決定)~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--VisualTransform : 変換(ビジュアルの変換値)~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--VisualEdgemode : 端の描画方法~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
-Visualオブジェクトの階層構造
┬Visual
├UIElement
│└FrameworkElement
├ContainerVisual
│├DrawingVisual
│├HostVisual
└Viewport3DVisual
--System.Windows.Media.ContainerVisualクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
Visualオブジェクトのコレクションのコンテナとして使用され...
--System.Windows.Media.DrawingVisualクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
---図形(ベクタ グラフィックス)、イメージ、モニター(ビ...
---レイアウトやイベントの処理を実現しないため軽量で、背景...
---また、ContainerVisualクラスから派生するため、Visualオ...
--System.Windows.Media.Media3D.Viewport3DVisualクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
---2DのVisualオブジェクトとVisual3Dオブジェクト間のブリッ...
---Viewport3DVisualでは、Cameraプロパティ(シーンを表示)...
-Visualオブジェクトの描画コンテンツ
--Visualオブジェクトは、描画コンテンツを格納した下記の4...
--また、命令リストを表すオブジェクトとして、DrawingGroup...
--なお、Drawingクラスは基本抽象クラスであり、描画コンテン...
---描画コンテンツ:ベクタ グラフィックス、イメージ、モニ...
---派生クラス:GeometryDrawing 、ImageDrawing 、VideoDraw...
--System.Windows.Media.Drawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.DrawingGroupクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.GeometryDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.ImageDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.VideoDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.GlyphRunDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
-MSDN > Windows Presentation Foundation > グラフィックス...
--Drawingオブジェクトの概要~
http://msdn.microsoft.com/ja-jp/library/ms751619.aspx
--方法:GeometryDrawingを作成する~
http://msdn.microsoft.com/ja-jp/library/ms742533.aspx
--方法:ImageDrawingを使用してイメージを描画する~
http://msdn.microsoft.com/ja-jp/library/ms753315.aspx
--方法:VideoDrawingを使用してメディアを再生する~
http://msdn.microsoft.com/ja-jp/library/aa969812.aspx
-Visualオブジェクトの命令リスト
|項番|命令リスト|説明|h
|1|ベクタ グラフィックス&br;(GeometryDrawing)|Geometry...
|2|イメージ&br;(ImageDrawing)|デジタル メディア ファイ...
|3|モニター&br;(VideoDrawing)|デジタル メディア ファイ...
|4|グリフ&br;(GlyphRunDrawing)|テキストとフォントで表...
--System.Windows.Media.Geometryクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.Penクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
--System.Windows.Media.Brushクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
-レンダリング データのレンダリング~
Visualオブジェクトの描画コンテンツであるベクタ グラフィッ...
--DrawingVisual・DrawingImage オブジェクトのDrawingプロパ...
--もしくはDrawingオブジェクトのPen・Brushプロパティ
>として表される。
>なお、
--DrawingVisual・DrawingGroupオブジェクトに、DrawingGroup...
--DrawingImageオブジェクトにDrawingGroup、Drawingオブジェ...
--DrawingVisual・DrawingImageオブジェクトが「レンダリング...
DrawingGroupオブジェクトは、自身に設定されているプロパテ...
+Children
+OpacityMask
+Opacity
+BitmapEffect
+ClipGeometry
+GuidelineSet
+Transform
**System.Windows.UIElement [#de06b271]
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
UIElementは、WPFコア レベル実装の基本クラス
***目的 [#t187a88c]
UIElementは、WPFコア レベル実装の基本クラスで、下記を目的...
-派生クラスで、オーバーライドする仮想メソッドを公開する。
-派生クラスで、仮想メソッドをオーバーライドすることによっ...
--「レイアウト」
--「ルーティング イベント」
-自要素と子要素の「レイアウト」を操作する。
-キーボード、マウス、およびスタイラスなどによる入力操作に~
対する「ルーティング イベント」と、関連するプロパティが含...
***機能 [#beb7a80f]
-子要素の「レイアウト」(サイズ指定・配置)
-ユーザ入力への応答、「ルーティング イベント」
-「アニメーション」システムを部分的にサポート
***プロパティの例 [#ad49dd69]
-IsEnabled : UI要素の有効・無効~
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
-Visibility : UI要素の可視性~
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
-AllowDrop : D&Dの有効・無効~
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
-Focusable : フォーカスの有効・無効~
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
-RenderTransform : 変換(アニメーションや一時効果の追加)~
http://msdn.microsoft.com/ja-jp/library/system.windows.ui...
**System.Windows.FrameworkElement [#ed372988]
http://msdn.microsoft.com/ja-jp/library/system.windows.fr...
UIElementに、「レイアウト」、「スタイル」を中心とした機能...
***概要 [#e5e82b73]
FrameworkElementは、UIElementの仮想メンバへ、以下を導入す...
-ポリシー・カスタマイズの導入
--「レイアウト」
--動的「リソース」
--「スタイル」~
「テンプレート」は、FrameworkElementではなく、コントロー...
--「アニメーション」~
アニメーションは、 UIElementで定義されているが、Framework...
FrameworkElement.BeginStoryboardメソッドと、その関連メン...
--「データ バインディング」
-新しいサブシステムの導入
***機能 [#f8d915d0]
-追加の「レイアウト」特性の定義
-動的「リソース」
--「スタイル」のサポート
--「アニメーション」のサポートの強化
-「データ バインディング」
***プロパティの例 [#ga6ec042]
-Style : 使用されるスタイル~
http://msdn.microsoft.com/ja-jp/library/system.windows.fr...
-UseLayoutRounding : サイズと位置の丸め要・否~
http://msdn.microsoft.com/ja-jp/library/system.windows.fr...
-LayoutTransform : 変換(回転、拡大縮小、傾斜、平行移動)~
http://msdn.microsoft.com/ja-jp/library/system.windows.fr...
**System.Windows.Controls.Control [#p2c5df5e]
http://msdn.microsoft.com/ja-jp/library/system.windows.co...
「テンプレート」を使用して外観を定義する UI 要素の基本ク...
Controlの最も重要な機能は、「テンプレート」である。
この「テンプレート」により、
-コントロールの「外観」を宣言型マークアップでカスタマイズ...
-また、「イベント ハンドラ」や「イベント トリガ」などもこ...
「テンプレート」を「スタイル」化することで、任意の型のコ...
**System.Windows.Controls.ContentControl [#e85cfa8d]
http://msdn.microsoft.com/ja-jp/library/system.windows.co...
-ContentControl は、Contentプロパティを持つコントロールで...
-Contentプロパティには、文字列に限らず、様々な子要素を1つ...
--代表的なContentControl型の(ContentControlクラスから派...
--なお、プロパティへ子要素を設定するXAML構文を、
---「プロパティ属性構文」
---「プロパティ要素構文」
>>と呼び、この中で、特にContentプロパティに子要素を設定す...
-ContentControlも、Contentプロパティの表示に特化した「テ...
**System.Windows.Controls.ItemsControl [#j79a4288]
-ItemsControlは、1つのコンテンツを設定するContentControl...
複数のコンテンツを設定できるItemsコレクション プロパティ...
-Itemsコレクション プロパティには、様々な子要素を複数設定...
--代表的なItemsControl型の(ItemsControlクラスから派生し...
ComboBox、ListBox、TabControl、TreeViewなどがある。
--なお、同様にItemsコレクション プロパティに子要素を設定...
-ItemsControlも、Itemsコレクション プロパティの表示に特化...
*要素ツリー [#p05c4c4f]
WPFは、ビジュアル要素や、CLRオブジェクトによる「要素ツリ...
「要素ツリー」は、XAMLやプログラムにより、構築される。
-MSDN > Windows Presentation Foundation > 方法 : 要素を...
http://msdn.microsoft.com/ja-jp/library/ms752374.aspx
例えばXAMLは、次の「プロパティ要素構文」の暗黙的、または...
-DockPanel.Children(Panel.Children)プロパティ
-ListBox.Items(ItemsControl.Items)プロパティ
<DockPanel>
<!--implicit: <DockPanel.Children>--> → プロパティ要素...
<ListBox DockPanel.Dock="Top">
<!--implicit: <ListBox.Items>--> → プロパティ要素構...
<ListBoxItem>
<TextBlock>Dog</TextBlock>
</ListBoxItem>
<ListBoxItem>
<TextBlock>Cat</TextBlock>
</ListBoxItem>
<ListBoxItem>
<TextBlock>Fish</TextBlock>
</ListBoxItem>
<!--implicit: </ListBox.Items>--> → プロパティ要素構...
</ListBox>
<Button Height="20" Width="100" DockPanel.Dock="Top">B...
<!--implicit: </DockPanel.Children>--> → プロパティ要...
</DockPanel>
-ただし、「要素ツリー」は、実体そのものではない「メタファ...
-これは、WPFのUIサブシステムのアーキテクチャ、UIフレーム...
-「要素ツリー」には、「論理ツリー」・「ビジュアル ツリー...
--MSDN > WPFの基礎 > WPFのツリー~
http://msdn.microsoft.com/ja-jp/library/ms753391.aspx
**論理ツリー [#ofdb8805]
「論理ツリー」は、CLRオブジェクトの要素のツリーを表し、「...
以下のXAMLとコードは、同じ「論理ツリー」(CLRオブジェクト...
***XAML [#a1a94e7f]
<DockPanel>
<ListBox Width="100">
<ListBoxItem>Dog</ListBoxItem>
<ListBoxItem>Cat</ListBoxItem>
<ListBoxItem>Fish</ListBoxItem>
</ListBox>
<Button Click="OnClick">OK</Button>
</DockPanel>
***コードビハインド [#qf0ea5dd]
DockPanel dp = new DockPanel();
ListBox lbx = new ListBox();
lbx.Width = 100;
ListBoxItem lbxItem = null;
lbxItem = new ListBoxItem();
lbxItem.Content = "Dog";
lbx.Items.Add(lbxItem);
lbxItem = new ListBoxItem();
lbxItem.Content = "Cat";
lbx.Items.Add(lbxItem);
lbxItem = new ListBoxItem();
lbxItem.Content = "Fish";
lbx.Items.Add(lbxItem);
dp.Children.Add(lbx);
Button btn = new Button();
btn.Content = "OK";
btn.Click += new RoutedEventHandler(this.OnClick);
dp.Children.Add(btn);
this.AddChild(dp);
**ビジュアル ツリー [#o813f26f]
「ビジュアル ツリー」は、「論理ツリー」と異なり、ビジュア...
このため、アプリケーションのUIで使用する、全てのVisualオ...
***レンダリング順序 [#f42d2e01]
「ビジュアル ツリー」階層の最上位の要素(ルート ビジュア...
***ルート ビジュアル [#ca4aa149]
ルート ビジュアルは、「ビジュアル ツリー」階層の最上位の...
--Window : 「Window画面」
--NavigationWindow : 「ナビゲーション フレームワーク」
--Win32アプリケーションにホストされる場合、Win32ウィンド...
>MSDN > Windows Presentation Foundation > チュートリアル:~
Win32アプリケーションでのビジュアル オブジェクトのホスト~
http://msdn.microsoft.com/ja-jp/library/ms754039.aspx
**論理ツリーと、ビジュアル ツリーの確認方法 [#k6ab5976]
実際に、「要素ツリー」の内容を確認したい場合は、以下のヘ...
-LogicalTreeHelper:「論理ツリー」の子要素を照会~
http://msdn.microsoft.com/ja-jp/library/system.windows.lo...
-VisualTreeHelper:「ビジュアル ツリー」の子要素を照会~
http://msdn.microsoft.com/ja-jp/library/system.windows.me...
上記のヘルパ クラスの使用例を、サンプルコードとして以下に...
***LogicalTreeHelper [#e72a4ad7]
LogicalTreeHelperを使用する場合は、以下のPrintLogicalTree...
private void PrintLogicalTree() {
Debug.WriteLine("PrintLogicalTree");
PrintLogicalTree(0, this);
}
// 論理ツリーを出力する。
// DependencyObjectの場合は、子要素も再帰的に表示する
private void PrintLogicalTree(int level, DependencyObjec...
PrintObject(level, obj);
foreach (var child in LogicalTreeHelper.GetChildren(ob...
if (child is DependencyObject) {
PrintLogicalTree(level + 1, (DependencyObject)chil...
}
else {
PrintObject(level + 1, child);
}
}
}
***VisualTreeHelper [#k7112a97]
VisualTreeHelperを使用する場合は、以下のPrintVisualTreeメ...
private void PrintVisualTree() {
Debug.WriteLine("PrintVisualTree");
PrintVisualTree(0, this);
}
// ビジュアル ツリーを表示する。
// DependencyObjectの場合はビジュアル ツリー上の子要素も...
private void PrintVisualTree(int level, DependencyObject...
PrintObject(level, obj);
foreach (var child in GetVisualChildren(obj)) {
if (child is DependencyObject) {
PrintVisualTree(level + 1, (DependencyObject)child);
}
else {
PrintObject(level + 1, child);
}
}
}
// ビジュアル ツリーの子要素の列挙を返す
private IEnumerable<object> GetVisualChildren(Dependency...
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(...
yield return VisualTreeHelper.GetChild(obj, i);
}
}
***共通 [#lbeaa2bd]
結果をインデントつきで出力
// ToStringの結果をインデントつきで出力
private void PrintObject(int level, object obj) {
Debug.WriteLine(new string('\t', level) + obj);
}
*WPFプロパティ システム [#u00b87e5]
本項では、DependencyObjectにより実装される「WPFプロパティ...
-「依存関係プロパティ」
-「添付プロパティ」
-「プロパティ値の継承」
について説明する。
なお、それぞれのプロパティの定義方法などについても触れる...
-MSDN > Windows Presentation Foundation~
コントロール > コントロールのカスタマイズ > コントロール...
http://msdn.microsoft.com/ja-jp/library/ms745025.aspx
**依存関係プロパティ [#y0f446a9]
「依存関係プロパティ」は、「WPFプロパティ システム」によ...
「依存関係プロパティ」では、変更監視・有効値検証などの機...
-MSDN > WPFの基礎 > プロパティ > 依存関係プロパティの概要~
http://msdn.microsoft.com/ja-jp/library/ms752914.aspx
***用途 [#y018495e]
「依存関係プロパティ」は、下記で使用されている。
-動的な「リソース」参照
--「スタイル」
--「アニメーション」
-「データ バインディング」
-「添付プロパティ」
-「プロパティ値の継承」
***定義 [#a9c8a7fa]
「依存関係プロパティ」は、一般的なプロパティであるCLRプロ...
-定義方法~
以下、「依存関係プロパティ」の定義方法について説明する。
--public static readonly(VBでは、Public Shared ReadOnly...
--「依存関係プロパティ」名の末尾に「Property」を付与する...
--変数宣言時か、静的コンストラクタを初期化する。~
DependencyProperty.Register メソッドを使用し「依存関係プ...
http://msdn.microsoft.com/ja-jp/library/system.windows.de...
--「依存関係プロパティ」は、プロパティの設定・取得方法が...
CLRプロパティでラップし、プロパティにアクセスし易いように...
-実装例~
以下、「依存関係プロパティ」の定義の実装例を示す。
// 依存関係プロパティを実装するクラス
public class ConcreteDependencyObject : DependencyObject {
// 依存関係プロパティ
public static readonly DependencyProperty CaptionPrope...
// 静的コンストラクタ
static ConcreteDependencyObject(){
// 静的コンストラクタで依存関係プロパティを登録
CaptionProperty = DependencyProperty.Register(
"Caption", // プロパティ名
typeof(string), // プロパティの型
typeof(ConcreteDependencyObject), // プロパティの...
new PropertyMetadata()); // 各種メタデータ
}
// 依存関係プロパティは設定・取得方法が特殊であるので、
// 以下のように、CLRプロパティでラップする。
public string Caption {
get { return this.GetValue(ConcreteDependencyObject....
set { this.SetValue(ConcreteDependencyObject.Caption...
}
}
-MSDN > WPFの基礎 > プロパティ
--カスタム依存関係プロパティ~
http://msdn.microsoft.com/ja-jp/library/ms753358.aspx
--XAML読み込みと依存関係プロパティ~
http://msdn.microsoft.com/ja-jp/library/bb613563.aspx
***機能 [#accfccff]
「依存関係プロパティ」では、以下のような機能が使用可能に...
-プロパティの既定値の設定
-ソース プロパティの変更監視コールバックの設定
-プロパティ値の強制コールバックの設定
-プロパティ値の有効値検証コールバックの設定
なお、以下それぞれの機能の説明と、DependencyProperty.Regi...
-プロパティの既定値の設定~
プロパティの既定値を設定する。
new PropertyMetadata("DefaultValue")
--MSDN > .NET Frameworkクラス ライブラリ > System.Windows...
http://msdn.microsoft.com/ja-jp/library/system.windows.pr...
-ソース プロパティの変更監視コールバックの設定~
「依存関係プロパティ」が、有効なプロパティ値に変更された...
例えば、値を「最小値 ~ 最大値の間に強制する」などの用途...
new PropertyMetadata("DefaultValue",
new PropertyChangedCallback(OnPropertyChangedCallback))
// プロパティ値の変更監視コールバック
private static void OnPropertyChangedCallback(
DependencyObject d, DependencyPropertyChangedEventArgs...
// プロパティ値の変更監視の例:
string oldValue = (string)e.OldValue;
string newValue = (string)e.NewValue;
DependencyProperty dp = e.Property;
}
--MSDN > .NET Frameworkクラス ライブラリ > System.Windows...
http://msdn.microsoft.com/ja-jp/library/system.windows.pr...
-プロパティ値の強制コールバックの設定~
「依存関係プロパティ」の値が再評価されたり、強制が明示的...
new PropertyMetadata("DefaultValue",
new PropertyChangedCallback(OnPropertyChangedCallback),
new CoerceValueCallback(OnCoerceValueCallBack))
// 依存関係プロパティ値の強制コールバック
private static object OnCoerceValueCallBack(DependencyOb...
// プロパティ値の強制の例:
// Captionプロパティ値に「"ChangeValue"」が設定されな...
// Captionプロパティ値は「"DefaultValue"」を強制する。
if (value.ToString() == "ChangeValue") return value;
return "DefaultValue";
}
--MSDN > .NET Frameworkクラス ライブラリ > System.Windows...
http://msdn.microsoft.com/ja-jp/library/system.windows.co...
-プロパティ値の有効値検証コールバックの設定~
「依存関係プロパティ」の値が再評価された際、有効値を検証...
new PropertyMetadata("DefaultValue",
new PropertyChangedCallback(OnPropertyChangedCallback),
new CoerceValueCallback(OnCoerceValueCallBack),
new ValidateValueCallback(OnValidateValueCallback));
// プロパティ値の有効値検証コールバック
private static bool OnValidateValueCallback(object value...
// プロパティ値の有効値検証の例:
// Captionプロパティ値に「" DengerousValue "」が設定さ...
if (value.ToString() == "DengerousValue") return false;
return true;
}
--MSDN > .NET Frameworkクラス ライブラリ > System.Windows...
http://msdn.microsoft.com/ja-jp/library/system.windows.va...
**添付プロパティ [#bb2645d8]
「添付プロパティ」は、「WPFプロパティ システム」によって...
-MSDN > WPFの基礎 > プロパティ > 添付プロパティの概要~
http://msdn.microsoft.com/ja-jp/library/ms749011.aspx
***用途 [#c7733074]
-「添付プロパティ」は、親要素で定義されるプロパティに対し...
子要素がそれぞれ別の値を指定するなど、任意のオブジェクト...
-「添付プロパティ」の代表的な使用例には、~
「パネル要素」などの子要素を格納する親要素が、子要素のレ...
-ここでは、
--親要素として、Canvas要素
--子要素として、TextBlock要素
>を例に挙げて説明する。
>TextBlockのレイアウトを制御するため、
-TextBlockに(仮に)CanvasTop、CanvasLeftプロパティを持た...
-TextBlockが、Canvas要素の子要素ではない場合、
>無駄なプロパティとデータを持つことになる。
>この問題を解決するため、「添付プロパティ」は、親要素が子...
以下は、レイアウトを制御するCanvas要素の「添付プロパティ...
<Canvas>
<TextBlock Canvas.Top="10" Canvas.Left="20">
Hello World!
</TextBlock>
</Canvas>
>子要素から親要素への「添付プロパティ」設定の際、内部的に...
***定義 [#a8cf6d48]
「添付プロパティ」を定義する場合は、「依存関係プロパティ...
-DependencyProperty.Registerメソッドではなく、
-DependencyProperty.RegisterAttached メソッドを使用し
「添付プロパティ」として登録する。
-MSDN > WPFの基礎 > プロパティ > 方法:添付プロパティを登...
http://msdn.microsoft.com/ja-jp/library/ms753957.aspx
--MSDN > .NET Frameworkクラス ライブラリ > System.Windows...
http://msdn.microsoft.com/ja-jp/library/system.windows.de...
また、「添付プロパティ」はCLRプロパティ ラッパではなく、
-Get(プロパティ名)
-Set(プロパティ名)
の名称付与基準に従った、専用の静的 get、setアクセッサ メ...
public static void Setプロパティ変数名(UIElement element...
element.SetValue(this.プロパティ変数, value);
}
public static Boolean Getプロパティ変数名(UIElement elem...
return (Boolean)element.GetValue(this.プロパティ変数);
}
これらのアクセッサ メソッドは、XAMLリーダが「添付プロパテ...
コードビハインドから、これらのアクセッサ メソッドを使用し...
<Canvas x:Name="myCanvas">
</Canvas>
TextBlock textBlock = new TextBlock();
textBlock.Text = "Hello World!";
// 添付プロパティを設定
Canvas.SetTop(textBlock, 10);
Canvas.SetLeft(textBlock, 20);
this.myCanvas.Children.Add(textBlock);
**プロパティ継承(包含継承) [#qaec881f]
-「WPFプロパティ システム」では、包含継承(HTMLコードと同...
HTMLでは、例えば、body要素に対してstyle属性やfont属性でフ...
※ 注:オブジェクト指向プログラミングにおける継承(派生ク...
-これを実現するのが「プロパティ値の継承」の機能である。
--「プロパティ値の継承」がされる一部のプロパティは、「要...
--この動作は、子要素から親要素のプロパティを設定する「添...
「プロパティ値の継承」の仕組みも、「添付プロパティ」と同...
(そのため、「添付プロパティ」と同様、プロパティの登録にD...
-MSDN > WPFの基礎 > プロパティ > プロパティ値の継承~
http://msdn.microsoft.com/ja-jp/library/ms753197.aspx
***用途 [#g25b76d5]
-包含継承の機能は、親要素、例えば、ルート要素(Window or ...
一度だけ定義することで、画面全体のポリシーを統一するよう...
-「プロパティ値の継承」がされるプロパティの一例として、以...
--Control.FontSizeプロパティ
--FrameworkElement.FlowDirectionプロパティ.etc
***定義 [#w433fade]
DependencyProperty.RegisterAttachedメソッドの第4引数に指...
-MSDN > WPFの基礎 > プロパティ > プロパティ値の継承 - カ...
http://msdn.microsoft.com/ja-jp/library/ms753197.aspx#Mak...
なお、「プロパティ値の継承」のブロッキング境界として、Fra...
*データ バインディング [#dac6f2bf]
WPFでは、
-ビュー(XAML:データの表示)と
-モデル(コードビハインド:チェック処理や、データアクセス...
を分離するための仕組みとして、「データ バインディング」と...
-連載 WPF/Silverlight UIフレームワーク入門:~
第2回 データの表示と入力に必要な知識 (1/5) - @IT~
http://www.atmarkit.co.jp/ait/articles/0905/19/news145.html
***「依存関係プロパティ」との関係 [#k47c9306]
これには、前述の「依存関係プロパティ」を使用している。
-「データ バインディング」を利用すれば、
--ビューとモデルの接点を、任意のプロパティ接続だけに限定...
--このため、ビューの内部にビューとモデルを接続するロジッ...
ビュー内のコード量を削減すると同時に疎結合を実現できる。
-「データ バインディング」により、~
2つのオブジェクトを結合するが、通常、
--ビュー側のXAMLで生成されたCLRオブジェクトを「バインディ...
--モデル側のコードビハインドで生成されたCLRオブジェクトを...
>と呼ぶ。
***「バインディング ターゲット」と「バインディング ソース...
この2つのオブジェクトを結合するためにBinding オブジェク...
-なお、
--「バインディング ターゲット」に入力されたデータや、
--「バインディング ソース」の更新通知によるデータの、
>妥当性検証の機能は、(継承する)~
「WPFプロパティ システム」を実装するDependencyObjectによ...
-また、この「バインディング ソース」からの更新通知の機能...
(実装する)INotifyPropertyChangedインターフェイスにより...
それぞれ、これに合わせた実装が必要になる。
**データ バインディングの構成要素 [#c9b8331b]
このため、「データ バインディング」の機能は、~
以下の3つの要素によって提供されると言って良い。
-DependencyObjectオブジェクト
-INotifyPropertyChanged インターフェイス
-Bindingオブジェクト
***DependencyObjectオブジェクト [#s6d62344]
ビュー側「バインディング ターゲット」のDependencyObjectオ...
-System.Windows.DependencyObjectクラス~
https://msdn.microsoft.com/ja-jp/library/system.windows.d...
***INotifyPropertyChanged インターフェイス [#t5dbd931]
モデル側「バインディング ソース」のINotifyPropertyChanged...
-System.ComponentModel.INotifyPropertyChangedインターフェ...
http://msdn.microsoft.com/ja-jp/library/system.componentm...
***Bindingオブジェクト [#c6e05036]
上記2つの要素を結び付けるBindingオブジェクト
-System.Windows.Data.Bindingクラス~
https://msdn.microsoft.com/ja-jp/library/system.windows.d...
**「データ バインディング」のプロパティ [#y87c2f7b]
Bindingクラスが持つ主要なプロパティ
|項番|プロパティ|説明|h
|1|Mode|データが反映される方向を、以下の列挙型から選択し...
|2|Source|「バインディング ソース」を指定する。|
|3|Path|「バインディング ソース」のプロパティ名を指定す...
**XAMLで「データ バインディング」を実装 [#db619849]
「データ バインディング」は、XAML上の要素のプロパティ値と...
「{Binding ・・・}」という記述を使用してBindingオブジェクト...
**DataContextの使用 [#v92c0074]
-MSDN > .NET Frameworkクラス ライブラリ > FrameworkElemen...
http://msdn.microsoft.com/ja-jp/library/system.windows.fr...
-「バインディング ソース」と「バインディング ターゲット」...
Bindingオブジェクトの規定のターゲットであるDataContextプ...
-「データ バインディング」では、「バインディング ターゲッ...
このため、FrameworkElement.DataContextプロパティに、任意...
-なお、DataContextプロパティは、「プロパティ値の継承」に...
このため、指定した「バインディング ソース」は、親要素から...
親要素(もしくは自身)のDataContextプロパティに「バインデ...
**型変換(値コンバータ) [#w78d8241]
-「データ バインディング」では、
--「バインディング ターゲット」と
--「バインディング ソース」で
>プロパティ型が異なる場合、暗黙的な型変換が行われる。
-型変換の動作のカスタマイズの必要性
--暗黙の型変換が失敗する場合
--入力数値から背景色を変更するような処理を実装したい場合。
-型変換の動作のカスタマイズの実装
--暗黙の型変換(または値変換)が失敗する場合、nullが返さ...
この対応としてIValueConverter インターフェイスを実装した~
「値コンバータ」を実装することで明示的な型変換(または値...
--なお、「値コンバータ」で型変換できない場合も同様に、nul...
nullが返された場合、通常は何も表示されないが、これをカス...
Binding.TargetNullValueプロパティを実装し、ソース値が nul...
**色々なデータ バインディングのパターン [#p660eac3]
***(1)コードビハインドからの単方向のデータ バインディ...
-コードビハインドからのデータ バインディング~
「データ バインディング」の基本的な動作を理解するために、~
Bindingオブジェクトをコードビハインドで自作し、~
「バインディング ソース」と「バインディング ターゲット」を~
OneWayモードで結び付け、「データ バインディング」を行う。
--連載 WPF/Silverlight UIフレームワーク入門:第2回 デー...
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_02/ui...
-「バインディング ソース」にDataContextを使用して、~
「バインディング ソース」と「バインディング ターゲット」を~
OneWayモードで結び付け、「データ バインディング」を行う。
--連載 WPF/Silverlight UIフレームワーク入門:第2回 デー...
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_02/ui...
***(2)変更通知の追加(入力値の自動計算アプリケーション...
-(1)に以下を加えて、入力値の自動計算アプリケーションを...
--(1)と同じ、OneWayモードで結び付け、「データ バインデ...
--OneWayToSourceモードで結び付け、「データ バインディング...
--変更通知を追加し、計算された値を「バインディング ターゲ...
-変更通知を追加方法
--OneWay の「バインディング ソース」には、INotifyProperty...
--なお、UI要素の表示に関するプロパティは、基本的に「依存...
-連載 WPF/Silverlight UIフレームワーク入門:第2回 デー...
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_02/ui...
***(3)双方向のデータ バインディング(TextBoxとSliderの...
TwoWayモードで結び付け、「データ バインディング」を行う。
***(4)値コンバータの使用 [#nf7e2b6a]
以下に値コンバータを適用できる。
-OneWayモードを使用した「データ バインディング」~
TwoWayモードに対応した「値コンバータ」は、Convertメソッド...
-OneWayToSourceモードを併用した「データ バインディング」~
TwoWayモードに対応した「値コンバータ」は、ConvertBackメソ...
-TwoWayモードを使用した「データ バインディング」~
TwoWayモードに対応した「値コンバータ」は、Convert、Conver...
***(5)ItemsSourceへのデータ バインディング [#v1655e1f]
-ItemsSourceへのデータ バインディング~
ItemsControlから派生した要素のItemsSource属性にコレクショ...
-インデクサによるデータ バインディング~
DataGridの列にDataTableの指定の列をデータバインディングす...
XAMLの「バインディングのマークアップ拡張」にて、Bindingプ...
Path属性に角括弧を指定することで、インデクサを使用して接...
*ルーティング イベント [#m1474b2f]
イベントを生成したUIコントロール上だけでなく、「ビジュア...
例えば、Buttonコントロールが「テンプレート」を使用し、複...
下位のコントロールのイベントを上位のButtonコントロールで...
-MSDN > WPFの基礎 > イベント(WPF) > ルーティング イベン...
http://msdn.microsoft.com/ja-jp/library/ms742806.aspx
**ルーティング方法 [#jd3aaeae]
「ルーティング イベント」は、3つのルーティング方法のいず...
|項番|区分|機能|h
|1|トンネル|ツリーを下方向へ辿る。&br;最初に、「ビジュア...
|2|バブル|ツリーを上方向へ辿る。&br;最初に、イベントを発...
|3|直接|イベントを発生させた要素のみに、イベント ハンド...
-MSDN > WPFの基礎 > イベント~
ルーティング イベントの処理済みとしてのマーキング、および...
http://msdn.microsoft.com/ja-jp/library/ms747183.aspx
多くの場合、WPF から提供される入力イベントは、「トンネル ...
**通常の使い方 [#oc007e5d]
イベントを発生元の要素で処理する限り、「ルーティング イベ...
これは、「ルーティング イベント」は、
-共通ハンドラを定義する場合や、
-カスタム コントロールを複合化する場合などの、
「特定のシナリオ」で効果を発揮するためである。
例えば、以下は、Buttonコントロールのイベントを発生元の要...
この場合、WPFのデザイナにButtonコントロールをD & Dし、こ...
***XAML [#ef18a848]
<Grid>
<Button Height="23" Name="button1" Click="button1_Clic...
</Grid>
***コードビハインド [#b20f01bd]
public partial class Window1 : Window {
public Window1() {
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventA...
// button1_Click
}
}
**イベントの追加方法 [#o2b73970]
***XAML [#f9a9eb48]
XAMLでは、イベント リスナである要素の属性にイベント ハン...
「型コンバータ」により、イベント ハンドラを設定できる。~
上記のClick="button1_Click"が、それに該当する。
-コードビハインド~
なお、イベントの指定をXAMLの「型コンバータ」からではなく...
次の2種類の方法(メソッド、演算子)で行うことができる。
--UIElement.AddHandlerメソッドを利用する場合:
this.button1.AddHandler(Button.ClickEvent, new RoutedEve...
--オーバーロードされた演算子を利用する場合:
this.button1.Click += new RoutedEventHandler(button1_Cli...
**サンプル [#m7ba51ae]
下記のXAMLは、
-「トンネル ルーティング イベント」:PreviewMouseDownイベ...
-「バブル ルーティング イベント」:MouseDownイベント
の動作を確認するためのサンプル。
***論理ツリー [#v1d8321f]
StackPanel - Border - Rectangle
***XAML [#t063843b]
<StackPanel x:Name="stackPanel1"
Height="100" Width="100" Orientation="Vertical"
MouseDown="stackPanel1_MouseDown"
PreviewMouseDown="stackPanel1_PreviewMouseDown">
<Border x:Name="border1"
MouseDown="border1_MouseDown"
PreviewMouseDown="border1_PreviewMouseDown">
<Rectangle x:Name="rect1"
Height="100" Width="100" Fill="Black"
MouseDown="rect1_MouseDown"
PreviewMouseDown="rect1_PreviewMouseDown">
</Rectangle>
</Border>
</StackPanel>
***コードビハインド [#cd8a9d19]
/// <summary>stackPanel1のMouseDownイベント</summary>
private void stackPanel1_MouseDown(object sender, MouseE...
System.Diagnostics.Debug.WriteLine("→ stackPanel1_Mous...
}
/// <summary>stackPanel1のPreviewMouseDownイベント</summ...
private void stackPanel1_PreviewMouseDown(object sender,...
System.Diagnostics.Debug.WriteLine("→ stackPanel1_Prev...
}
/// <summary>border1のMouseDownイベント</summary>
private void border1_MouseDown(object sender, MouseEvent...
System.Diagnostics.Debug.WriteLine("→ border1_MouseDow...
}
/// <summary>border1のPreviewMouseDownイベント</summary>
private void border1_PreviewMouseDown(object sender, Mou...
System.Diagnostics.Debug.WriteLine("→ border1_PreviewM...
}
/// <summary>rect1のMouseDownイベント</summary>
private void rect1_MouseDown(object sender, MouseEventAr...
System.Diagnostics.Debug.WriteLine("→ rect1_MouseDown");
}
/// <summary>rect1のPreviewMouseDownイベント</summary>
private void rect1_PreviewMouseDown(object sender, Mouse...
System.Diagnostics.Debug.WriteLine("→ rect1_PreviewMou...
}
このコードを実装して、画面上のRectangleをクリックすると、...
stackPanel1_PreviewMouseDown
→ border1_PreviewMouseDown
→ rect1_PreviewMouseDown
→ rect1_MouseDown
→ border1_MouseDown
→ stackPanel1_MouseDown
なお、各イベント ハンドラで「e.Handled = true」を実行する...
----
Tags: [[:.NET開発]], [[:UIサブシステム]], [[:WPF/Silverli...
ページ名: