Tag: XAML

目次

参考情報

名前空間

基本

  • WPFとSilverlightをまとめて習得しよう − @ITが参考になる。
  • XAMLファイルの先頭は次のような行を含んでいる。
    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

  • x:Nameはインスタンスの名前を指定する機能。
  • WPFの基本クラスにはNameプロパティが存在しておりNameプロパティを設定する=x:Nameを指定することと同じ。

Tips

他プロジェクトのクラスを参照する

  • [参照]→[追加]でプロジェクト参照を追加する。参照する側と参照される側のプロジェクトで、対象のフレームワークはあわせておく。
  • さらにxamlでassemblyを追加する。
    <Window xmlns:view="clr-namespace:Sample.View;assembly=SampleLib">
    

条件によってコントロールの表示・非表示を切り替える

  • BooleanToVisibilityConverter クラス (System.Windows.Controls)を使用して、ControlのVisibilityにバインドする。
  • サンプル
      <Window.Resources>
        <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter"/>
      </Window.Resources>
      <TextBox Visibility={Binding IsValid, Mode=OneWay,Converter={StaticResource booleanToVisibilityConverter} }"/>
    

定数を定義して使う

XAML中で定数を定義し、幅やマージンなどに一括して指定したい場合次のようにする。

  • Systemをヘッダー部分でインポート。
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
  • リソースで定数を定義
        <Window.Resources>
            <sys:Double x:Key="theWidth">48</sys:Double>
        <Window.Resources>
    
  • StaticResourceで参照する。
       <Button Width="{StaticResource theWidth}">OK</Button>

トラブルシューティング

デザイナでStaticResourceが参照できない

  • 例えばResources_ja.xamlとResources_en.xamlを用意し、コードのなかでどちらかをロードしている場合、デザイナから上記xaml内のリソースを読み込めずエラー(波線表示)になってしまう。
  • たとえ無駄になるとしても、App.xamlなどでデフォルトリソースは読み込むようにしておけばエラーを抑制することは可能。
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Resources_en.xaml" />
                </ResourceDictionary.MergedDictionaries>
    

デザイナのDataTemplateでNullReferenceExceptionが発生

  • DataTemplateの内部で、ローカライズするためのRes拡張やLoc拡張など(サードパティ製)を使って、デフォルトのプロパティを使っていることが原因らしい。
  • 原因はDesigner reports DataTemplate object null referenceと同じ。以下の要領で修正してやればよい(テストのためにはDateTemplate内でLoc拡張を一箇所だけ使ったサンプルを作ればわかりやすい)。
    # {Loc HelloWorld}
    {Loc Key=HelloWorld}
    

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-13 (水) 16:47:20 (1160d)