2011-12-05 11 views
4

私は自分のコントロールをいくつかのボタンとイベントで書いています。これは魅力的です。次に、このコントロールを他のクラスのStackPanelの子として動的に配置します。このクラス(StackPanel)のカスタムコントロールからイベントを取得するにはどうすればよいですか?ユーザーコントロールに公開イベントがあります。どうすればStackPanelクラスから処理できますか?wpfでイベントを処理する

私のようなもの記述しようとしています:私のpublic ThumbnailClickはルーティングされますが、それは動作しないようにするには

public event EventHandler<ThumbnailEventArgs> ThumbnailClick 
    { 

     add { AddHandler(ThumbnailClickEventRouted, value); } 

     remove { RemoveHandler(ThumbnailClickEventRouted, value); } 

    } 
    public static RoutedEvent ThumbnailClickEventRouted; 

を。

答えて

0

ルーティングされたイベントはバブルアップするので、スタックパネルでキャッチするだけです。あなたのルーティングイベントを登録するときに選択してくださいRoutingStrategy.Bubble

MainWiindow

<StackPanel local:UserControl1.Tap="Grid_Tap" > 
    <local:UserControl1 Width="120"></local:UserControl1> 
</StackPanel> 

ユーザーコントロール

<Grid> 
    <Button Click="Button_Click">Tap Me</Button> 
</Grid> 

ユーザー制御コード

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    // Create a custom routed event by first registering a RoutedEventID 
    // This event uses the bubbling routing strategy 
    public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
     "Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserControl1)); 

    // Provide CLR accessors for the event 
    public event RoutedEventHandler Tap 
    { 
     add { AddHandler(TapEvent, value); } 
     remove { RemoveHandler(TapEvent, value); } 
    } 

    // This method raises the Tap event 
    void RaiseTapEvent() 
    { 
     RoutedEventArgs newEventArgs = new RoutedEventArgs(UserControl1.TapEvent); 
     RaiseEvent(newEventArgs); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     RaiseTapEvent(); 
    } 
} 

コードの一部で背後UserControl1はMicrosoftのドキュメントから対応しています。

+0

透明なソリューションをありがとう。私は忘れてしまった(12時間働いているので{{)} XAML要素に設定したので、 –

0

編集:raise the eventread the overviewも必要です。


あなたのイベントは、あなたがほとんどどこからでもに加入することができるはずです公開されている場合は、次のXAMLでは

:それぞれの*.xaml.cs

<StackPanel> 
    <local:MyControl MyEvent="MyControl_OnMyEvent"/> 

private void MyControl_OnMyEvent(object sender, EventArgs e) 
{ 
    //Handler logic here 
} 

必要に応じて引数のタイプを変更します。イベントがroutedある場合

アップあなたもStackPanelでそれを購読することができます。これはあなたがすべてのインスタンスにハンドラを追加することなく、一つの場所にあるすべてのMyControl子供たちのイベントを処理することもできます

<StackPanel local:MyControl.MyEvent="MyControl_OnMyEvent"> 

+0

私はこのコントロールをdinamically追加しています。私はできませんでした 私はを持っています。そして、プロパティはありませんstackpanel –

+0

私のイベントをルーティングしようとしていますが、何かがうまくいかない( –

+0

@PapaJohn:概要を読んだことがありますか?それぞれのメソッドを使ってイベントを発生させましたか?(編集参照) –