&tag(XAML);
*目次 [#e529b795]
#contents
*参考情報 [#tfb8f37c]
-[[WPF]]
*名前空間 [#l0e68c8a]
**基本 [#p71fb4ac]
-[[WPFとSilverlightをまとめて習得しよう − @IT:http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_01/uiframework_01_01.html]]が参考になる。
-XAMLファイルの先頭は次のような行を含んでいる。
#pre{{
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
}}
-1行目はWPF名前空間を規定の名前空間(プレフィックスなし)として使用することを宣言している。これによりWindowやButtonタグをXMLファイルのなかで使うことができる。
-2行目はXAMLの言語機能をxプレフィックスとして使うことを宣言している。x:Nameや、x:Class属性がこれに該当する。WPFフレームワーク関係なしの共通機能がここで定義されている。
**x:Name [#w1de3151]
-x:Nameはインスタンスの名前を指定する機能。
-WPFの基本クラスにはNameプロパティが存在しておりNameプロパティを設定する=x:Nameを指定することと同じ。
*Tips [#o17c3303]
**他プロジェクトのクラスを参照する [#j7b9745c]
-[参照]→[追加]でプロジェクト参照を追加する。参照する側と参照される側のプロジェクトで、対象のフレームワークはあわせておく。
-さらにxamlでassemblyを追加する。
#pre{{
<Window xmlns:view="clr-namespace:Sample.View;assembly=SampleLib">
}}
**条件によってコントロールの表示・非表示を切り替える [#f16e7534]
-[[BooleanToVisibilityConverter クラス (System.Windows.Controls):http://msdn.microsoft.com/ja-jp/library/system.windows.controls.booleantovisibilityconverter(v=vs.80).aspx]]を使用して、ControlのVisibilityにバインドする。
-サンプル
#pre{{
<Window.Resources>
<BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter"/>
</Window.Resources>
<TextBox Visibility={Binding IsValid, Mode=OneWay,Converter={StaticResource booleanToVisibilityConverter} }"/>
}}
**定数を定義して使う [#g1339fd2]
XAML中で定数を定義し、幅やマージンなどに一括して指定したい場合次のようにする。
-Systemをヘッダー部分でインポート。
xmlns:sys="clr-namespace:System;assembly=mscorlib"
-リソースで定数を定義
#pre{{
<Window.Resources>
<sys:Double x:Key="theWidth">48</sys:Double>
<Window.Resources>
}}
-StaticResourceで参照する。
<Button Width="{StaticResource theWidth}">OK</Button>
*トラブルシューティング [#d33de88a]
**デザイナでStaticResourceが参照できない [#n52ac2ce]
-例えばResources_ja.xamlとResources_en.xamlを用意し、コードのなかでどちらかをロードしている場合、デザイナから上記xaml内のリソースを読み込めずエラー(波線表示)になってしまう。
-たとえ無駄になるとしても、App.xamlなどでデフォルトリソースは読み込むようにしておけばエラーを抑制することは可能。
#pre{{
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources_en.xaml" />
</ResourceDictionary.MergedDictionaries>
}}
**デザイナのDataTemplateでNullReferenceExceptionが発生 [#la616210]
-DataTemplateの内部で、ローカライズするためのRes拡張やLoc拡張など(サードパティ製)を使って、デフォルトのプロパティを使っていることが原因らしい。
-原因は[[Designer reports DataTemplate object null reference:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a877c4a9-245b-4ec4-81a6-d83e864a4523/]]と同じ。以下の要領で修正してやればよい(テストのためにはDateTemplate内でLoc拡張を一箇所だけ使ったサンプルを作ればわかりやすい)。
#pre{{
# {Loc HelloWorld}
{Loc Key=HelloWorld}
}}