0

RoutedEventsがどのように機能するかを理解しようとしています。ええと-私はいくつかのチュートリアルをウォークスルーし、RoutedEventsがなぜ有用であるのかとそれらがどのように機能するのかを理解しました。しかし、私が得られないことが1つあります。

RoutedEventプロパティsthを持つクラス(「MyClass」など)を作成したとしましょう。このような:

public class MyClass 
{
public static readonly RoutedEvent myEvent;
...
}

ええと-プロパティを与えるだけでは十分ではありません-だから私はEventManagerの助けを借りてRoutedEventを登録する必要があります:

...
myEvent = EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyClass));
...

わかりました-これで、WPFイベントシステムはこのイベントを認識します。そのようにすると、私が作成する各クラスには独自のRoutedEventがあります。しかし、それは私には意味がありません。

私が欲しいのは、他のクラスがMyClassのタイプではなく、同じイベントをリッスンすることです。

例:スタックパネルがあり、スタックパネル内にボタンがあります。スタックパネルをクリックすると、onClickイベントが発生します。ボタンをクリックすると、ボタンのonClickイベントが発生し、次にスタックパネルでonClickイベントが発生します。しかし、どのように?

申し訳ありませんが、問題を説明するのは難しいです。混乱しすぎています:)

ありがとう。CodeCannibal

4

1 に答える 1

1

私が欲しいのは、他のクラスがMyClassのタイプではなく、同じイベントをリッスンすることです。

あなたはこれからの権利を期待し、これがそれが提供するものです。つまり、RoutedEventを登録するということは、それを型に強くバインドしていないということです。代わりに、文字列 "MyEvent" EventManager.RegisterRoutedEvent( "MyEvent"、..。を使用してブリッジします。

RoutedEventは論理ツリーをトラバースし、処理されるとトラバースを停止します(例外があります)。

したがって、StackPanelはMyClassから派生する必要はありません。アクション/ハンドラーを指定して、StackPanelでRoutedEventを登録する必要があります。RoutedEventがStackPanelをトラバースするたびに、対応するアクションが呼び出されます。

例えば:

UserControl1.cs

//Routed Event
public static readonly RoutedEvent ThisIsEvent = EventManager.RegisterRoutedEvent("ThisIs", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserControl1));

// .NET wrapper
public event RoutedEventHandler ThisIs
{
    add { AddHandler(ThisIsEvent, value); }
    remove { RemoveHandler(ThisIsEvent, value); }
}

//local handler where RaiseEvent is called
private void button1_Click(object sender, RoutedEventArgs e)
{
    RaiseEvent(new RoutedEventArgs(ThisIsEvent));
}

以下は、XAMLでそのイベントをサブスクライブする方法です。コードファイルでこれを行うこともできます...

<StackPanel Orientation="Vertical" **local:UserControl1.ThisIs="StackPanel_ThisIs"** >
    <local:UserControl1></local:UserControl1>
</StackPanel>

これであなたの疑問が明らかになることを願っています。

于 2012-05-21T11:52:02.890 に答える