XAML の名前空間の謎が解けた

via http://social.msdn.microsoft.com/Forums/ja-JP/wpfja/thread/a0ed39c6-22c7-4ab3-8ac0-af775d02c91c/

XAML で使う XML 名前空間 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ってどういうカラクリなんだろうと不思議だったけど、XmlnsDefinitionAttribute クラスを使って XML 名前空間CLR 名前空間を結びつけることができるんだそうな。なるほどー。

AssemblyInfo.cs あたりに
[assembly: System.Windows.Markup.XmlnsDefinition( "http://siokoshou", "Hoge.Fuga" )]
と書く。
そして、XAML で xmlns:snp="http://siokoshou" とすると snp:Puyo のように参照できると。

使い方はこちらが詳しいです。
http://blogs.wankuma.com/kzt/archive/2009/01/09/166020.aspx

ちなみに試してみたら、 のように x:Type を使うと型が見つからないって怒られた。DataType="snp:PuyoViewModel" と書くと OK でした。

  • OK ……
  • NG ……

この2つはまったく同じことだと思ってたのに、違うんだねぇ。バグなのかわざとなのか微妙だけどw

WPFアセンブリには
[assembly: System.Windows.Markup.XmlnsDefinition( "http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows" )]
のようなのがズラズラ並んでると思われ。そうやってたくさんのクラスが一つの XML 名前空間で見えるようになってるんですね。

というわけで
[assembly: System.Windows.Markup.XmlnsDefinition( "http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Hoge.Fuga" )]
と書いておけばまるっとOKというお話でした。うそです、マネしちゃだめです、きっと後で苦しみます。