Silverlight2入門記3 - イベントをコードで割り当てる -

前回から一日空いてしまいました。心より恥じる。
前回は無事足し算が出来ました。足し算ではVSにお任せでイベントハンドラxaml側で設定していました。
今回は、C#側のコードでイベントハンドラを設定してみます。


一番簡単にコードでイベントハンドラを足すには、Pageのコンストラクタで足すのが一番です。
ただし注意点が1点。InitializeComponentメソッドが呼び出された後でないと
xaml側の構成情報がロードされていません。
なので、何かイベントを足したいならInitializeComponentメソッドの後に記載します。
(実際InitializeComponentメソッドの前にやったら、画面に何も表示されませんでした)

実際に足して見ます。
イベントを記載するときはVSのインテリセンスにおまかせするのが良いみたいです。

たとえば

aaa.MouseEnter +=

とまで打てば、候補が出るのでTabで自動生成してやれば、EventHandlerインスタンス
割り当てるイベントリスナまで自動で生成してくれます。これは便利。

たとえばaaaというキャンバスのMouseEnterイベントのハンドラは以下のようになります。

            aaa.MouseEnter += new MouseEventHandler(aaa_MouseEnter);
……
        void aaa_MouseEnter(object sender, MouseEventArgs e)
        {
        }


ではコードをみてみます。
xamlは下記のようになります。

<UserControl x:Class="EventAdding.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <Canvas x:Name="aaa" Width="400" Height="500" Background="LightGreen">
        <TextBlock x:Name="moge">aaa</TextBlock>
    </Canvas>
</UserControl>


コードによってイベントを足しこんだコードビハインドのクラスは下記のようになります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace EventAdding
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
            aaa.MouseEnter += new MouseEventHandler(aaa_MouseEnter);
            aaa.MouseLeave += new MouseEventHandler(aaa_MouseLeave);
        }

        void aaa_MouseLeave(object sender, MouseEventArgs e)
        {
            moge.Text = "はなれた。";
        }

        void aaa_MouseEnter(object sender, MouseEventArgs e)
        {
            moge.Text = "うはははは!";
        }

    }
}

静的に決まるイベントに関してはあまりコードで登録することも無いでしょうが、
動的にイベントを発生させたりさせなかったりするときはコードで足すテクニックは使いそうです。


(追記)

補足。
どうやらイベントを差し引くときには-=でいける模様。
先ほどのSilverlightアプリケーションにボタンをおしたらイベントを発生させないようにしてみた。

<UserControl x:Class="EventAdding.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <Canvas x:Name="aaa" Width="400" Height="500" Background="LightGreen">
        <TextBlock x:Name="moge">aaa</TextBlock>
        <Button x:Name="button" Content="hogehoge" Canvas.Top="40" Click="button_Click"/>
    </Canvas>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace EventAdding
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
            aaa.MouseEnter += new MouseEventHandler(aaa_MouseEnter);
            aaa.MouseLeave += new MouseEventHandler(aaa_MouseLeave);
        }

        void aaa_MouseLeave(object sender, MouseEventArgs e)
        {
            moge.Text = "はなれた。";
        }

        void aaa_MouseEnter(object sender, MouseEventArgs e)
        {
            moge.Text = "うはははは!";
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            aaa.MouseEnter -= new MouseEventHandler(aaa_MouseEnter);
            aaa.MouseLeave -= new MouseEventHandler(aaa_MouseLeave);
        }

    }
}