イベントというと、一番なじみが深いのはボタンのクリックイベントだと思う。
これからイベントの勉強をしていく上で、なじみの深いものから触れていくのはとってもええことじゃろう。
というわけで、夜も遅いのでボタンを押したらテキストブロックのラベルがHello Event!!に変わるものを作って寝ようと思う。
久しぶりにXAMLじゃなくてコードで画面を組んでみようと思う。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
namespace WpfEventIntro
{
public class MyApplication : Application
{
public MyApplication()
{
Startup += (sender, e) =>
{
HelloEventWindow window = new HelloEventWindow();
window.Show();
};
}
[STAThread]
static void Main(string[] args)
{
new MyApplication().Run();
}
}
public class HelloEventWindow : Window
{
public HelloEventWindow()
{
Init();
}
private void Init()
{
// 画面組み立て
var stackPanel = new StackPanel();
Content = stackPanel;
var textBlock = new TextBlock();
stackPanel.Children.Add(textBlock);
var button = new Button();
button.Content = "Click!";
// イベント!お馴染みです。
button.Click += (sender, e) =>
{
textBlock.Text = "Hello Event!!";
};
stackPanel.Children.Add(button);
}
}
}
イベントは、ハンドラこしらえるのがめんどくさかったのでラムダで書きました。
ApplicationとWindowがあるだけのシンプルなものです。
コードで画面を組み立てているのは、HelloEventWindowクラスのInitメソッド内です。
StackPanelを作ってTextBlockとButtonを追加してるだけのシンプルなものです。
button.Click += ...がイベントを追加してるコードになります。ここらへんは、.NET組み込みのイベントを使う場合となんら変わりありません。
ということで、上っ面を使うだけなら同じ感覚で使えます。
さて、これを実行すると
ボタンをクリックすると
予想通り。
次への勉強ネタのためにちょびっと改造をくわえます。
public class HelloEventWindow : Window
{
private TextBlock textBlock;
public HelloEventWindow()
{
Init();
// こういうこともできる。
AddHandler(Button.ClickEvent, new RoutedEventHandler(ClickHandler));
}
private void ClickHandler(object sender, RoutedEventArgs e)
{
textBlock.Text = "これでもHello Event!!";
}
private void Init()
{
// 画面組み立て
var stackPanel = new StackPanel();
Content = stackPanel;
// フィールドに移動!
textBlock = new TextBlock();
stackPanel.Children.Add(textBlock);
var button = new Button();
button.Content = "Click!";
// イベント!お馴染みです。
/* ここのイベントは無し
button.Click += (sender, e) =>
{
textBlock.Text = "Hello Event!!";
};
*/
stackPanel.Children.Add(button);
}
}
もともとあったイベントの定義をさくっとコメントアウトして、WindowのAddHandlerでButton.ClickEventに対してRoutedEventHandlerを設定しています。
こうすると、ボタンに直接イベントを結び付けてないのにちゃんと実行されます。
ボタンを2個置いても大丈夫。
public class HelloEventWindow : Window
{
private TextBlock textBlock;
public HelloEventWindow()
{
Init();
// こういうこともできる。
AddHandler(Button.ClickEvent, new RoutedEventHandler(ClickHandler));
}
private void ClickHandler(object sender, RoutedEventArgs e)
{
textBlock.Text = "これでもHello Event!!";
}
private void Init()
{
// 画面組み立て
var stackPanel = new StackPanel();
Content = stackPanel;
// フィールドに移動!
textBlock = new TextBlock();
stackPanel.Children.Add(textBlock);
var button = new Button();
button.Content = "Click!";
// イベント!お馴染みです。
/* ここのイベントは無し
button.Click += (sender, e) =>
{
textBlock.Text = "Hello Event!!";
};
*/
stackPanel.Children.Add(button);
var button2 = new Button();
button2.Content = "第二ボタン!";
stackPanel.Children.Add(button2);
}
}
実行してみると…
第二ボタン!を押下すると…
ちゃんとイベントが処理されてる。
ここらへん、WPFのイベントの動きの肝みたい?
眠いのでここまで。