読者です 読者をやめる 読者になる 読者になる

Control のベースクラスを作る。その2

ということで、前回の最後に XamlReader での挙動がきになると書いたので、試してみました。
前回の ControlBase を継承する MyControl と 同じように ControlBase を継承する OriginalControl を追加しました。

namespace MyApp
{
  public partial class OriginalControl : ControlBase
  {
    public OriginalControl()
    {
      InitializeComponent();
    }
    
    public string Subject { get; set; }
  }
}

MyControl には Title プロパティを追加してみました。

namespace MyApp
{
  public partial class MyControl : ControlBase
  {
    public MyControl()
    {
      InitializeComponent();
    }

    public string Title { get; set; }
  }
}

で、複数の ControlBase を持てるように Controls クラスを作ります。

namespace MyApp
{
  public class Controls
  {
    public Controls()
    {
      this.Children = new List<ControlBase>();
    }

    public List<ControlBase> Children { get; private set; }
  }
}

準備完了です。XamlReader で読み込んでみます。

XamlReader.Load(@"<Controls
  xmlns='http://schemas.microsoft.com/client/2007'
  xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  <Controls.Children>
    <MyControl x:Name='c1' Title='title1' />
    <OriginalControl x:Name='c2' Subject='title2' />
  </Controls.Children>
</Controls>");

Unknown Element Controls なんてメッセージが出ました。自動的に探してくれるんじゃないんだろうか・・・。
気を取り直してネームスペースを定義します。

XamlReader.Load(@"<local:Controls
  xmlns='http://schemas.microsoft.com/client/2007'
  xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  xmlns:local='clr-namespace:SilverlightApplication8;assembly=SilverlightApplication8'>
  <local:Controls.Children>
    <local:MyControl x:Name='c1' Title='title1' />
    <local:OriginalControl x:Name='c2' Subject='title2' />
  </local:Controls.Children>
</local:Controls>");

いけました。ちょいと謎な部分ものこりますが。