<資料>
非常に分かりやすい資料:Windows Presentation Foundation 概要(WPF) (.NET Framework)
(このページの右隅下側に「Windows Presentation Foundation」の統合メニューがあり、そこから概要や基本構造などのページが閲覧できます。非常に分かりやすいので困ったときは読むこと)
(慣れた頃に読むと良い)WPF入門 - @IT
たぶんMSDN内で最新のバインディングに関するサンプルや資料で読みやすい:方法のトピック
XAMLのコントロールの仕様を見たい場合はここが見やすい:System.Windows.Controls 名前空間







<利用頻度の高いマークアップ拡張>
Binding 通常のバインディング。{Binding X}という書き方は{Binding Path=X}と同じ意味である。ElementName=で対象をエレメントにしたり、Source=でソースにしたり、RelativeSource=でターゲットの位置に対して相対的な位置を指定することにより、バインディング ソースを取得できる。続くPathで対象のプロパティを指定する。バインディング・ソースがXMLデータの場合、PathプロパティではなくXPathプロパティを利用する
TemplateBinding コントロールテンプレートの適用先のコントロールに与えられたプロパティ値を取得するために利用する


   <StackPanel>   
       <!--エレメントをキーで参照してバインディング-->
       <TextBox x:Name="TextBox1" Text="5"/>
       <Slider Value="{Binding ElementName=TextBox1, Path=Text}"/>
       <!--先祖をたどってWindow要素を見つけプロパティTitleをバインディング-->
       <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=Title}"/>      
       <!--自分自身のプロパティWidthを参照してHeightにバインディング-->
       <Rectangle Fill="Aqua" Width="50" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"/>  
   </StackPanel>


<利用頻度の高いコードスニペット>
propdp 依存プロパティを記述する際に非常に便利



<利用頻度の高いusing>
System.ComponentModel DependencyObjectを利用したい場合に必要。INotifyPropertyChangedは自動実装される
Microsoft.Win32 コモンダイアログの利用等に
System.IO File.Open関数などファイル入出力
System.Windows.Markup XamlWriter.Save関数などシリアライズ



<利用頻度の高いプロパティ>
Resources リソース、XAML内にオブジェクトを作ったりする際に利用する。リソースのコードを書く位置に注意:利用するオブジェクトのコードより上(先に宣言しておく必要がある)に書かれている必要がある
Content プロパティは Object 型である為、格納できる項目に制限は無い。つまり文字でもUIElementでもなんでも入れて表示できる
DataContext 子へと継承可能なコレクションを指定する
Items そのコントロールが扱うアイテムコレクション(絶対指定オブジェクト)。ItemsSourceとの併用は不可らしい
ItemsSource そのコントロールで利用したいリソース内のコレクション、もしくはバインディングオブジェクトをここで設定する(相対指定オブジェクト)
IsSynchronizedWithCurrentItem 選択アイテムの変更を反映させる。ComboBoxやListBoxエレメント等で利用する
DisplayMemberPath オブジェクト内のテキスト表示するプロパティを指定する(ちなみにプロパティウインドウではキーボードで直接名前を入力した方が早い)
Name エレメントの名前 ElementNameのキー値指定時にここで設定した一意のキー名を利用する。反対に言えばこれを設定しない場合バインディングできない(しない)
Text 表示するテキスト
SelectedValuePath 選択アイテムを値で参照する際のコレクション内のプロパティ先を文字列で指定できる
SelectedValue 選択する値
SelectedIndex 選択するインデックス
SelectedItem 現在選択されているアイテムオブジェクト。このまま続けて「.~」でプロパティを書いてもOK。例 <Image Source="{Binding SelectedItem.FileLocation, ElementName=ComboBox1}"></Image>



<利用頻度の高いオブジェクト>
Style スタイル指定。TargetTypeプロパティでスタイルを適用するターゲットをコントロール名で指定できる
Setter Style等をセットする。Property と Value を使用して対象プロパティを指定し値をセットする。Style内に複数指定可能
ResourceDictionary リソースのオブジェクトを生成する。XAMLのファイル指定も可能。MergedDictionarieで複数の辞書を結合できる
Style.Triggers トリガー動作するスタイルを指定する。プロパティにイベント、バリューに値を指定。子のSetterで設定指定する
ControlTemplate コントロール・テンプレートを作成する。TargetTypeで動作するコントロール。XAMLで挟む内容に視覚要素を書くと良い
ContentPresenter この要素が置かれた位置にコントロールの中身(=Contentプロパティに与えた値)が配置される

コントロール・テンプレートがコントロールの表示方法をカスタマイズするものであるのに対して
データ・テンプレートはデータの表示方法をカスタマイズするものである

<トリガーの種類>
  • Trigger: 特定のプロパティの値の変化をトリガーとして、Setterを用いてプロパティ値を変更する。
  • MultiTrigger: Triggerを複数条件に対応させたもの。指定したすべての条件が満たされた場合にトリガーがかかる。
  • DataTrigger: スタイル適用先のUI要素だけでなく、データ・バインディングされたデータを監視する。
  • MultiDataTrigger: DataTriggerの複数条件版。
  • EventTrigger: プロパティ値の変化ではなく、イベントの発生をトリガーとする。また、Setterではなくストーリーボードを使ったアニメーションによりプロパティ値を変化させる。
<コントロール・テンプレートの作成>
ボタンなどのコントロールの基底となるControlクラス(System.Windows.Controls名前空間)は
Templateというプロパティを持っていて、このTemplateプロパティにControlTemplateクラス
(System.Windows.Controls名前空間)のインスタンスを設定すればよい。

リソースの作成例:
   <Window.Resources>
       <ResourceDictionary>
           <ResourceDictionary.MergedDictionaries>
               <ResourceDictionary Source="Dictionary1.xaml" />
               <ResourceDictionary>
                   <Style TargetType="Button">
                       <Setter Property="Background" Value="BlanchedAlmond"></Setter>
                       <Setter Property="FontSize" Value="30"></Setter>
                   </Style>
               </ResourceDictionary>
           </ResourceDictionary.MergedDictionaries>
       </ResourceDictionary>
   </Window.Resources>
トリガーの作成例:
       <StackPanel.Resources>
           <Style TargetType="TextBox">
               <Setter Property="Background" Value="LightGray"/>
               <Style.Triggers>
                   <Trigger Property="IsMouseOver" Value="True">
                       <Setter Property="Background" Value="LightBlue"/>
                   </Trigger>
                   <Trigger Property="IsFocused" Value="True">
                       <Setter Property="Background" Value="LightPink"/>
                   </Trigger>
               </Style.Triggers>
           </Style>
       </StackPanel.Resources>
コントロール・テンプレートの作成例:
   <Window.Resources>
       <Style TargetType="Button">
           <Setter Property="Template">
               <Setter.Value>
                   <ControlTemplate TargetType="Button">
                       <Grid>
                           <Ellipse Width="100" Fill="{TemplateBinding Background}" />
                           <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                       </Grid>
                    </ControlTemplate>
               </Setter.Value>
           </Setter>
       </Style>
   </Window.Resources>
    
   <StackPanel>
       <Button Content="ABC" Background="Aqua" Height="50"/>
       <Button Content="DEF" Background="Crimson"/>
   </StackPanel>



<利用頻度の高いXAML>
VisualStudio上のXAMLはコードで書いた方がスムーズに作業できる。
コードの入力方法が分らない際、プロパティウインドウをヘルプ的に利用してもよいが煩雑なので基本的にコード作業推奨
  • インテリセンスが利用できない事柄。以下の状況ではまったくインテリセンスが働かない
    • バインディングの際のElementNameのキー値指定やリソースのキー値指定
    • ルーティングイベントのハンドラの記述(資料
以上の理由からバインディングの割り当てやリソース値の作成や割り当てはプロパティウインドウを利用するのがやりやすい
  • XAML は大文字と小文字を区別する
  • プロパティ属性値は文字列で設定する。
  • この文字で指定されたプロパティの値は適切な型変換されなければならない(WFPは既定で特定の型変換のクラスを持っていてコンパイル時適切に処理されている)
  • 必要であれば型変換を自分で作らなければならない
  • XMLで記述する注意点。XAMLの記述にはXML形式を用いるため「<」「>」「&」「"」などの文字はそのままでは利用できない。これにはCDATAセクションを用いる(「<![CDATA[」と「]]>」で囲む)
xmlns:一意の名前 名前空間の指定(オススメはsrc(ソース)など良さそう)
一意の名前:オブジェクト名 これにより名前空間内のCLRオブジェクト(C#のオブジェクト等)にアクセスできる。インスタンスもこれで作成できる
<!-- Text --> 注釈
x:Key 各リソースにキー値、一意の名前を設定します。エレメントに名前を付けたりResourceやStyleやTemplate等さまざまに使用します
x:Class XAML ページの分離コードを提供するクラスの CLR 名前空間とクラス名を指定します
<x:Code> <![CDATA[]]>等と併用すればXAML内にCLRコードなどが埋め込める/>
<x:XData> XMLデータアイランドをXAML稼働環境内に配置できるようにします。主にXmlDataProvider の子オブジェクトとして使用される。資料
<XmlDataProvider> データ バインディングで使用する XML データへの宣言アクセスを有効にします。これによりインライン XML データを埋め込むことができます。プロパティ「XPath」:データ コレクションの生成に使用される XPath クエリを取得または設定します。資料



<単語>
Dependency 依存する
XAML Extensible Application Markup Language の略。「拡張アプリケーションマークアップ言語」みたいな意味。CLRにおけるオブジェクトのインスタンス(以降、CLRオブジェクト)を生成するためのマークアップ言語。Metroスタイルでも利用できる。
WPF Windows Presentation Foundation の略
Parser パーサー 型変換のこと
コードビハインド(code-behind) XAML 中に記述したGUI要素とC#(CLR)で記述したプログラム処理を分離して製作する考え方。デザイナーとプログラマーそれぞれ分けて作業できるようにする仕組み。デザイナーがコードを読まなければいけない時点で仕組み的に、やや無理がある気もする
マークアップ拡張 { }で囲まれた部分で行う拡張機能の事。例 Text="{Binding ElementName=slider1, Path=Value}"/> リソースの利用時もマークアップ拡張で指定を行う。例 <TextBox Text="{DynamicResource String1}" FontSize="{DynamicResource value}" />
アトリビュートシンタックス(Attribute Syntax) プロパティをセットする構文 例<Window Title="MainWindow" Height="350" Width="525">
プロパティエレメントシンタックス(Property Element Syntax) プロパティ要素構文。同じくプロパティをセットするがエレメントのような扱いで構文を書く 例 <TextBox Width="80"> <Binding ElementName="slider1" Path="Value"/> </TextBox> 少し手の込んだ階層構造のプロパティはこちらの構文でないと書けないものがある
URI (Uniform Resource Identifier) インターネット上やローカルのハードディスク内にあるファイルを参照できる仕組み
Loose XAML CLRを含まずXAMLのみで動くプログラムの事。IEやfireFox等で動く



<ファイル構成>
App.xaml この XAML ファイルでは、WPF アプリケーションとすべてのアプリケーション リソースを定義します。<Application.Resources>タグ内で指定する。リソースのコードを書く位置に注意 利用するオブジェクトのコードより上(先に宣言しておく必要がある)に書かれている必要がある



<データバインドの要点>
データーバインディングの概念とデータフローの方向
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。
データバインドの具体的なコード例はWPF_サンプルを参照
こちらも詳しい資料:WPFの「データ・バインディング」を理解する-@IT



<利用頻度の高いCLRクラス>
ObservableCollection<T> 通知アリのデータコレクション
IValueConverter 型コンバータを作成する際に利用するクラス。ValueConversion属性も合わせて利用するらしい

<図形>
Rectangle 矩形(四角)
Ellipse
Polygon 多角形
Line



型変換
  • XAMLプロセッサにとって全てはテキスト文字列として受け取られている
  • 最終的にテキストはプロパティの値の型に変換される必要がある
たとえば、<LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> のように指定した場合
XAMLプロセッサは既定の設定により"0,0"というstringをPoint.X=0,Point.Y=0という風に型変換している
これにはPointConverterクラスが利用されている

<PointConverterの例>
           PointConverter a = new PointConverter();
           string str = "12,24";
           Point test =  (Point)a.ConvertFrom(str);
           string test2 = (string)a.ConvertTo(test, typeof(string));
これにより文字列"12,24"がPoint型のx=12,y=24に変換される
最後の行ではPoint変換された値を、またもとのstringに変換している
ConvertFrom()はXAMLのコンパイル時の型変換に利用され、ConvertTo()はシリアライズに利用される

このような仕組みを利用してカスタムな型変換処理を組み込むことができる
詳細は資料:TypeConverters および XAMLを参照

C#(CLR)で書いたクラスをWPFのXAML上でインスタンス化したい場合、まずXAMLのカスタムプレフィクスを定義してアセンブリの型を XAML で参照できるようにする必要がある
XAML要素としてのカスタム クラスの要件
  • カスタム クラスがパブリックであり、既定の (パラメーターなしの) パブリック コンストラクターがサポートされている
  • カスタム クラスが入れ子になっていない。入れ子になったクラスや、そのクラスの一般的な CLR で使用される構文の "ドット" は、添付プロパティなどの他の WPF または XAML の機能に干渉します。
<Page x:Class="WpfApplication1.Page1"
     xmlns:src="clr-namespace:WpfApplication1"
これで参照が通っているのでC#内のコードで書かれたPersonクラスをインスタンス化したい場合
   <Page.Resources>
       <src:Person x:Key="test" Name="このようにプロパティもセットできる"/>
   </Page.Resources>
のように一意のキーを指定した上でインスタンス化する。この際プロパティを使って値をセットできる。この場合、以後XAML内で「test」の名前でこのオブジェクトにアクセスできる
セットできるプロパティの値は自動的にIDEに識別される。intやstringはもちろんPoint等(Point="12,24"みたいに)も可能。これは正確に言うと型変換されている
カスタムクラスのインスタンス化はエレメントのリソース内でしか出来ない(この場合<Page.Resources>内)。たとえばコントローラー内で同じ宣言をするとエラーが出る
  • 「CLR内のオブジェクト」はビルドが通ってはじめてアセンブリとして認識されるので、どこまでIDEがオブジェクトを認識しているか状況把握しておく事(未ビルドで書いたばかりのコードはIDEからみて認識されていない!)
  • 「XAML内のリソース」も同様で未ビルドではIDEに存在を認識されていない。注意する事!
作成したインスタンスは属するエレメントのリソース部によりStaticResourceとして扱われる(上記の例の場合、PageのStaticResourceとして扱われる)
インスタンスからプロパティを経由してデータを取り出したい場合はデータバインディングを使用する。以下例
   <Grid>
       <TextBox Text="{Binding Name, Source={StaticResource test}}"/>
   </Grid>
List<Person>のようなコレクションもインスタンス化出来る。C#側は class PesonList:List<Person>{} のような形で宣言しておいてXAML側は以下のようにします
   <Window.Resources>
       <src:PesonList x:Key="ListTest">
           <src:Person Name="test1" ID="1"/>
           <src:Person Name="test2" ID="2"/>
           <src:Person Name="test3" ID="3"/>
       </src:PesonList>
   </Window.Resources>

この2行は何をしているか?について
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
C#におけるusingのクラスライブラリの読み込みみたいなものらしい
詳しくはXAML ルート要素と XAML 名前空間を参照
using System.Linq;
using System.Text;
こんな感じでXAMLで利用するセットを名前空間で設定している(・・・クラスライブラリの外部サーバーへの配置。クラウド化みたいな考えで良いのかな?)

この部分は何をしているか?について
       xmlns:System="clr-namespace:System;assembly=mscorlib" 
       x:Class="WpfApplication1.MainWindow"
ここで読み込まれている mscorlib.dll(DLLファイル)には、.NET Frameworkの基本的なクラス・ライブラリのアセンブリが含まれており
これらのサービスを利用できるようにSystemという名前のキーにセットしている。利用したい場合は以下の例のように使う
       <Button>
           <System:DateTime>2004/3/4 13:6:55</System:DateTime>
      </Button>
x:Class属性には分離コードで実装するクラス名、上記の場合「WpfApplication1」名前空間のMainWindowクラスに分離コードを置く事を指定している
(「ビュー・モデルビュー・モデル」で言えば「モデルビュー・モデル」のコード(C#のCLR)を置く場所を指定している)

x:Name属性にはフィールド名を指定する

XAML内のクラスのインスタンスの作成は FrameworkElement.Resources プロパティ によって行う
<object>
 <object.Resources>
   oneOrMoreResourceElements
 </object.Resources>
</object>
object オブジェクト名
oneOrMoreResourceElements ここにリソース作成の為のコードを書く
C#からは
public ResourceDictionary Resources { get; set; }
で拾える。以下C#のCLRの例。(どのエレメントに属したリソースかが重要でコードの位置によって「this」等が必要な事に注意する)
LinearGradientBrush a = (LinearGradientBrush)this.Resources["backgroundBrush1"];
この場合、backgroundBrush1 がXAML側で設定したキー
最終更新:2012年11月14日 18:46