昨日書いた通り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上からしかできないようだ。かなり残念。。。
コメント