TOC

This article has been localized into Japanese by the community.

XMAL:

XAMLにおけるイベント

多くの現代的なUIフレームワークはイベント駆動ですが、WPFも同様です。Window(もまたControlクラスを継承しています)を含む全てのコントロールはサブスクライブしている広範囲のイベントを公開します。これらのイベントをサブスクライブできます。すなわちイベントが起こったらアプリケーションは知らせを受け、それに反応出来ることを意味します。

イベントには多くのタイプがありますが、もっとも一般的に使用されるものはアプリケーションでマウスやキーボードを使ったユーザーの操作に反応するものです。ほとんどのコントロールにはKwyDown,KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUpのようなイベントがあります。

WPFのイベントがどのように動作するか詳しく見ていきます。話が複雑になりますが、今のところはコードビハインドのコードの断片がXAMLのイベントとどのようにリンクしているのか知る必要があります。次のサンプルを見てください:

<Window x:Class="WpfTutorialSamples.XAML.EventsSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="EventsSample" Height="300" Width="300">
	<Grid Name="pnlMainGrid" MouseUp="pnlMainGrid_MouseUp" Background="LightBlue">        
		
    </Grid>
</Window>

メソッド名を書くことでGridのMouseUpイベントをどのようにサブスクライブしているか注意してください。このメソッドは正しいイベントシグネチャを使ってコードビハインドで定義される必要があります。このケースでは次のようになります:

private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
	MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}

MouseUpイベントはMouseButtonEventHandlerと呼ばれる、サブスクライブしたデリゲートを使います。それは二つのパラメータを取ります。一つはsender(イベントを発生したコントロール)で、もう一つは各種の情報を格納したMouseButtonEventArgsオブジェクトです。例の中ではマウスカーソルの位置を取得してユーザーに知らせるために用いています。

いくつかのイベントでは同じタイプのデリゲートを使います。例えばMouseUpとMouseDownイベントはどちらもMouseButtonEventHandlerデリゲートを使い、MouseMoveイベントではMouseEventHandler デリゲートを使います。イベントハンドラを書いているときは、そのイベントがどのデリゲートを使うか知らねばなりません。もしわからないときはドキュメントで調べることが出来ます。

幸運なことにVisual Studioは正しいイベントハンドラの生成を手助けしてくれます。もっとも簡単な方法は、XAMLにイベント名を書くだけです。するとVSのインテリセンスが残りをやってくれます。

<New Event Handler>を選べばVisual Studioはコードビハインドファイルに適切なイベントハンドラを生成してくれるでしょう。名前は<control name>_<event name>で、この場合はpnlMainGrid_MouseDownになります。イベント名を右クリックしてNavigate to Event Handlerを選べばVSが正しく導いてくれます。

コードビハインドからのイベントのサブスクライブ

イベントの最も一般的なサブスクライブの方法を説明しましたが、その代わりにコードビハインドから直接イベントをサブスクライブしたい場面があるかもしれません。それにはC#の+=演算子を使ってオブジェクトのイベントに直接イベントハンドラを加えます。これに関する完全な説明は専用のC#の例で行います。しかし比較のため例を示します:

using System;
using System.Windows;
using System.Windows.Input;


namespace WpfTutorialSamples.XAML
{
	public partial class EventsSample : Window
	{
		public EventsSample()
		{
			InitializeComponent();
			pnlMainGrid.MouseUp += new MouseButtonEventHandler(pnlMainGrid_MouseUp);
		}

		private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
		{
			MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
		}

	}
}

もう一度いいます。どのデリゲートを使うか知っていなければなりません。そしてもう一度、Visual Studioは手助けしてくれます。書いたらすぐに:

pnlMainGrid.MouseDown +=

Visual Studioは次のように補助します:

[Tab]キーを2回押すだけでVisual Studioは正しいイベントハンドラーを現在のメソッドのすぐ下に生成し、実装の準備が整います。このようにしてイベントをサブスクライブした場合はXAMLを編集する必要はありません。