かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
広告
アクセサリ

書庫

日記カテゴリ

[C#][WPF]イベントじゃけん その3

その1:http://blogs.wankuma.com/kazuki/archive/2008/02/21/124157.aspx
その2:http://blogs.wankuma.com/kazuki/archive/2008/02/21/124343.aspx

WPFのルーティングイベントは、3種類ある。

バブル:イベント発生元から親へ親へ上がっていく。
トンネル:要素ツリーのルートから子へ下がっていく。
直接:普通のCLRのイベントと同じく発生もとの人のみ。

よく使われてるのは、トンネルとバブルの二つだと思われる。
WPFのコントロールを眺めてると、PreviewHogehoge、Hogehogeという感じでセットでイベントがあるものが多く見られる。
これは、PreviewHogehogeがトンネルで、Hogehogeがバブルのルーティングイベントになってる。

そして、このイベントの引数のRoutedEventArgsのHandledプロパティをTrueに設定すると、それ以降のイベントが処理されなくなる。
MSDNを読む限りだと、「イベントを完全に処理したぜ!って自信があるときはHandledプロパティをTrueにして、要素ツリー内で同じイベントをリッスンしてる人たちとの間で誤動作を起こさないようにするといいわ。」という感じの内容が書いてあった。
というわけで、いつものPersonクラスをネタに簡単にルーティングイベントをこさえて試してみようと思う。

DependencyObjectの勉強をしてたときは、DependencyObjectを継承してたけど、ルーティングイベントはDependencyObjectではなくFrameworkElementで実装されてるようなのでFrameworkElementを継承して作る。

using System.Windows;

namespace WpfMyEvent
{
    public class Person : FrameworkElement
    {
    }
}

ここにイベントを作りこんでいく。
どんなネタにしようか悩んだ結果、誕生日をイベントとして扱ってみようと思う。
まずは、バブルのルーティングイベントBirthDayをこいつに登録する。

using System.Windows;

namespace WpfMyEvent
{
    public class Person : FrameworkElement
    {
        #region 誕生日イベント関係
        // 誕生日イベント
        public static RoutedEvent BirthDayEvent = EventManager.RegisterRoutedEvent(
            "BirthDay", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Person));
        public event RoutedEventHandler BirthDay
        {
            add { AddHandler(BirthDayEvent, value); }
            remove { RemoveHandler(BirthDayEvent, value); }
        }
        #endregion
    }
}

動作確認をしてみる。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace WpfMyEvent
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var person = new Person();
            person.BirthDay += (s, e) =>
                {
                    Console.WriteLine("人 > 誕生日イベント!!");
                };
            person.RaiseEvent(new RoutedEventArgs(Person.BirthDayEvent));
        }
    }
}

結果は書くまでもないけど、下のような感じ。

人 > 誕生日イベント!!

んじゃPreviewイベントもこさえてみようと思う。これは、イベント登録するときの第二引数をRoutingStrategy.TunnelにすればOKみたい。
ということで、さっくりと実装。

using System.Windows;

namespace WpfMyEvent
{
    public class Person : FrameworkElement
    {
        #region 誕生日イベント関係
        // 誕生日直前イベント
        public static RoutedEvent PreviewBirthDayEvent = EventManager.RegisterRoutedEvent(
            "PreviewBirthDay", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(Person));
        public event RoutedEventHandler PreviewBirthDay
        {
            add { AddHandler(PreviewBirthDayEvent, value); }
            remove { RemoveHandler(PreviewBirthDayEvent, value); }
        }

        // 誕生日イベント
        public static RoutedEvent BirthDayEvent = EventManager.RegisterRoutedEvent(
            "BirthDay", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Person));
        public event RoutedEventHandler BirthDay
        {
            add { AddHandler(BirthDayEvent, value); }
            remove { RemoveHandler(BirthDayEvent, value); }
        }
        #endregion
    }
}

ということで、誕生日直前イベントの動作も確認~。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace WpfMyEvent
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var person = new Person();
            person.BirthDay += (s, e) =>
                {
                    Console.WriteLine("人 > 誕生日イベント!!");
                };
            person.RaiseEvent(new RoutedEventArgs(Person.BirthDayEvent));

            person.PreviewBirthDay += (s, e) =>
                {
                    Console.WriteLine("人 > 誕生日直前イベント!!");
                };
            person.RaiseEvent(new RoutedEventArgs(Person.PreviewBirthDayEvent));
        }
    }
}

実行すると、こんな感じ。まだ連動して動くことは無い。

人 > 誕生日イベント!!
人 > 誕生日直前イベント!!

どうやって連動させて動かすんだろうと考えたんだけど、自分でがんばって連動するしかないんだろうね~。ということで、HappyBirthdayメソッドをこさえて、そこでPreviewとセットで動くようにしてみた。

ついでに、親子関係をきづくためのAddChildメソッドもこさえる。
これは、論理ツリーに追加するようにした。こうすると、バブルやトンネルのルーティングイベントがちゃんと親子の要素で連動するチック。

using System.Windows;

namespace WpfMyEvent
{
    public class Person : FrameworkElement
    {
        #region 誕生日イベント関係
        // 誕生日直前イベント
        public static RoutedEvent PreviewBirthDayEvent = EventManager.RegisterRoutedEvent(
            "PreviewBirthDay", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(Person));
        public event RoutedEventHandler PreviewBirthDay
        {
            add { AddHandler(PreviewBirthDayEvent, value); }
            remove { RemoveHandler(PreviewBirthDayEvent, value); }
        }

        // 誕生日イベント
        public static RoutedEvent BirthDayEvent = EventManager.RegisterRoutedEvent(
            "BirthDay", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Person));
        public event RoutedEventHandler BirthDay
        {
            add { AddHandler(BirthDayEvent, value); }
            remove { RemoveHandler(BirthDayEvent, value); }
        }

        // 誕生日イベントが起きるきっかけのメソッド
        public void HappyBirthDay()
        {
            // まず、事前のイベントを起こして
            var args = new RoutedEventArgs();
            args.RoutedEvent = PreviewBirthDayEvent;
            RaiseEvent(args);

            // 誕生日イベントを起こす
            args.RoutedEvent = BirthDayEvent;
            RaiseEvent(args);
        }
        #endregion

        // 子を登録
        public void AddChild(Person child)
        {
            this.AddLogicalChild(child);
        }
    }
}

RoutedEventArgsのRoutedEventプロパティは読み書きOKなので、それをすげかえてRaiseEventを投げるようにしてみた。

テストプログラム。親と子を作ってイベントをしかけてる。
二度目のHappyBIrthdayでは、親が事前にイベントをかすめとって誕生日イベントをなかったことにしてる。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace WpfMyEvent
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            // 親子の関係を構築!!
            var parent = new Person();
            var child = new Person();

            parent.AddChild(child);

            // 誕生日のイベントを登録
            child.BirthDay += (s, e) =>
                {
                    Console.WriteLine("子供 > 祝ってくれてありがとう!");
                    e.Handled = true;
                };

            // 誕生日だよ!祝って!!
            child.HappyBirthDay();

            // 親が横取り計画
            parent.PreviewBirthDay += (s, e) =>
                {
                    e.Handled = true;
                    Console.WriteLine("親 > 今年は誕生日しません!");
                };

            Console.WriteLine("--一年後--");

            // 誕生日だよ!祝って!!
            child.HappyBirthDay();
        }
    }
}

実行結果。二度目の誕生日は、悲しい結果に終わってる。

子供 > 祝ってくれてありがとう!
--一年後--
親 > 今年は誕生日しません!

投稿日時 : 2008年2月24日 1:27

Feedback

# nIdVRsLbrxkoOnZWoED 2012/01/07 13:22 http://www.luckyvitamin.com/p-110235-dynamic-healt

Gripping! I would like to listen to the experts` views on the subject!!...

# Christian Louboutin Pumps 2012/12/08 1:18 http://mychristianlouboutinonline1.webs.com/

Someone necessarily help to make critically articles I'd state. This is the very first time I frequented your web page and to this point? I amazed with the research you made to make this particular put up amazing. Excellent process!

# Echarpe Burberry 2012/12/12 11:32 http://www.fr-marque.com/

If you want a good management of these worthy of, count the children.

# sac longchamp soldes 2012/12/14 22:55 http://www.saclongchampachete.info

If a photostream consists of photos the fact that - regardless of whether good and also not : triggered a spirited comments¡ä line.

# sacs le pliage longchamp tote 2012/12/15 15:59 http://www.sacslongchamp2012.info/longchamps-darsh

It's RIGHT. You can remain a metacafe star =)

# soldesacslongchamp.info 2012/12/16 21:55 http://www.soldesacslongchamp.info

I accept as true with the pricey garbage thoughts. I dislike the glimpse, sound or simply feel on the Beats.

# michael kors classic solde 2012/12/17 21:11 http://www.sacmichaelkors.net/sac-michael-kors-cla

I trust the expensive garbage short review. I dislike the glimpse, sound or perhaps feel from the Beats.

# michael kors sac outlet 2012/12/18 5:58 http://michael-kors-canada.webnode.fr/blog/

Great article, it's helpful information.

# Michael Kors outlet 2012/12/18 22:19 http://sac-michael-kors.webnode.fr

Our pool really should be fed utilizing those photopages that you really consider seriously worth becoming perhaps the "Best Ideas Collection".

# Sacs Michael Kors 2012/12/19 13:53 http://sac-michael-kors.webnode.fr

Looking forwards to checking more!

# burberry outlet 2012/12/21 5:48 http://burberryukoutlets.wordpress.com

Ill be back down the track to think about other content articles that.

# Air Jordan Retro 4 2013/03/06 21:21 http://www.jordanretro4air.com/

Adore could be fallible within contraception, having said that it becomes healthier as they age with the price of the right way provided with. Air Jordan Retro 4 http://www.jordanretro4air.com/

# robenuk 2013/03/06 21:22 http://www.c88.fr/

Adore stands out as the energetic issue within the life-style in addition to increase of whatever most people fancy. robenuk http://www.c88.fr/

# Air Jordan Retro 4 2013/03/06 21:43 http://www.jordanretro4air.com/

A good bro isn't anyone, except anyone are usually an bro. Air Jordan Retro 4 http://www.jordanretro4air.com/

# code promo la redoute 2013/03/06 21:45 http://www.k88.fr/

I enjoy this program explore resulting from about what you do, then again resulting from what person So i am lake feel you have made. code promo la redoute http://www.k88.fr/

# destockchine 2013/03/06 21:48 http://www.c55.fr/

Romances last when ever every neighbor believes as well as hook superiority over the other sorts of. destockchine http://www.c55.fr/

# casquette obey 2013/03/15 5:19 http://www.b44.fr/

Don't bother to connect with others which can be functional to get along with. It's the perfect time who will catalyst yourself to pry your body in place. casquette obey http://www.b44.fr/

# destockmania 2013/03/18 8:25 http://www.ruenike.com/sac-c-19.html/

May well be Who needs our business in order to reach a couple different erroneous everyday people previous to meeting the right one, guaranteeing that muscle building last but not least satisfy the woman / man, in the following pararaphs discover how to sometimes be pleased. destockmania http://www.ruenike.com/sac-c-19.html/

# casquette los angeles 2013/03/22 21:13 http://e88.fr/

Around the globe could possibly be one person, on the other hand one customer could possibly be the earth. casquette los angeles http://e88.fr/

# f55.fr 2013/03/23 21:27 http://f55.fr/

Friendships persist while every single acquaintance believes that fresh hook superiority for several similar. f55.fr http://f55.fr/

# usine23 2013/03/24 0:44 http://e55.fr/

Do not ever scowl, if you might pitiful, to create can't say for sure who might be plunging deeply in love with your current smile. usine23 http://e55.fr/

# destockchine 2013/03/24 0:45 http://d77.fr/

Rarely ever frown, even if you are usually blue, because you not know who will plunging excited about your grin. destockchine http://d77.fr/

# destockchine 2013/03/25 5:15 http://c99.fr/

No need to connect with others who're easy to wear to get along with. Connect with others who'll stress people to prize your spouse out. destockchine http://c99.fr/

# laredoute 2013/04/07 9:10 http://ruezee.com/

Cheer could be a aromatise not possible to buy swarm attached to other consumers without ending up with a couple lowers attached to your own. laredoute http://ruezee.com/

# coach online outlet 2013/04/07 14:51 http://www.coachoutletcoupon55.com/

Around the world maybe you are a person, yet to 1 personal maybe you are everybody. coach online outlet http://www.coachoutletcoupon55.com/

# coachoutletonline999.com 2013/04/07 23:00 http://www.coachoutletonline999.com/

A friendly relationship would be the golden thread whom brings together all of the Black Maria pores and skin realm.

# chaussea 2013/04/08 5:44 http://ruemee.com/

Some sort of younger brother aren't an acquaintance, on the other hand an acquaintance are a younger brother. chaussea http://ruemee.com/

# asos 2013/04/08 15:22 http://rueree.com/

Please don't discuss about it your actual bliss to much privileged as compared to your true self. asos http://rueree.com/

# re: [C#][WPF]???????????3 2021/07/09 2:38 plaquenil hydroxychloroquine sulfate

cloriquin https://chloroquineorigin.com/# lupus usmle

# re: [C#][WPF]???????????3 2021/07/15 8:41 hydroxychlor tab

is chloroquine safe https://chloroquineorigin.com/# what is hydroxychloroquine 200 mg

# uDERNzRxIWTBVES 2022/04/19 14:26 markus

http://imrdsoacha.gov.co/silvitra-120mg-qrms

# oeowpjsheqzo 2022/05/25 4:15 tpgspydf

https://erythromycin1m.com/# buy erythromycin online

タイトル
名前
Url
コメント