WPF, Cider(Feb. CTP)でWindow上のコントロールの初期化をどこで行うべきか。

昨日書いた通りWinFormのときと同じつもりになって、Windowクラスのコンストラクタでやろうとすると玉砕できる。

結論から書くとWindowクラスのLoadedイベントで、そのWindowクラス上にあるコンポーネントの初期化するためのコードを書くべきのようだ。当然XAMLで指定できるものについてはXAMLでしていてかまわない。すごく順当なやり方が正解だということになる。今からWinFormでもこの癖をつけておいたほうがよさそうだ。

<XAMLの例>

   1:  <Window x:Class="FormInitializeSample.Window1"
   2:      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:      Title="FormInitializeSample" Height="145" Width="300" Loaded ="onLoad"
   5:      >
   6:    <Grid Width="292" Height="110">
   7:      <TextBox 
   8:        Width="NaN" Height="Auto" 
   9:        VerticalAlignment="Stretch" 
  10:        HorizontalAlignment="Stretch" 
  11:        Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1" 
  12:        Margin="74,32.7233333333333,16,50" 
  13:        Name="nameTextBox" ></TextBox>
  14:      <Label 
  15:        VerticalAlignment="Top" 
  16:        HorizontalAlignment="Left" 
  17:        Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1" 
  18:        Margin="9.37,32.7233333333333,0,0" 
  19:        Width="57.63" 
  20:        Height="27.2766666666667" 
  21:        Name="label1">Name</Label>
  22:      <Button 
  23:        Width="76" 
  24:        Height="26" 
  25:        VerticalAlignment="Top" 
  26:        HorizontalAlignment="Right" 
  27:        Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1" 
  28:        Margin="0,67,17,0" Name="messageButton" 
  29:        Click ="messageButton_Click">
  30:          Message
  31:       </Button>
  32:    </Grid>
  33:  </Window>

<同一クラスのコード側>

   1:  using System;
   2:  using System.Windows;
   3:  using System.Windows.Controls;
   4:  using System.Windows.Data;
   5:  using System.Windows.Documents;
   6:  using System.Windows.Media;
   7:  using System.Windows.Media.Imaging;
   8:  using System.Windows.Shapes;
   9:   
  10:   
  11:  namespace FormInitializeSample
  12:  {
  13:      /// <summary>
  14:      /// Interaction logic for Window1.xaml
  15:      /// </summary>
  16:   
  17:      public partial class Window1 : Window
  18:      {
  19:   
  20:          public Window1() {
  21:              InitializeComponent();
  22:          }
  23:          //Windowクラス::Loadedイベントのイベントメソッド
  24:          void onLoad(object sender, RoutedEventArgs e) {
  25:              //このイベント内でコントロールの初期化を行う。
  26:              this.nameTextBox.Text = "Taro";
  27:          }
  28:          
  29:          void messageButton_Click(object sender, RoutedEventArgs e) {
  30:              MessageBox.Show(string.Format("Hello, {0} !!", 
  31:                  this.nameTextBox.Text), "Hello");
  32:          }
  33:   
  34:      }
  35:   
  36:   
  37:  }

追記: (2006.03.12 22:44)

Feb. CTP + Ciderの組み合わせでは、イベントハンドラへのイベントメソッドの追加はXAML上からしかできないようだ。かなり残念。。。

コメントを残す