2016-08-10 10 views
0

カスタムUserControlを作成しました。内部にグリッドが付いたボタンです。C#のUserControl内でイベントバブリング

それを含むページ、MainPage.xamlから、私は、ユーザーコントロールにClickイベントをバインドする必要があり、かつEventHandlerのための機能が(ないユーザーコントロール内の)メインページで、外部に記述する必要があります。

したがって、私はthis questionを読んで、イベントとイベントをトリガーするEventHandler関数を作成しました。これらはUserControlの内部にあります。 これは、あなたが見ることができるように、私はAを配置した

UserControl.xaml.cs

public class MyButton : UserControl 
{ 
    public event RoutedEventHandler ButtonClicked; 

     private void ButtonClickedHandler() 
     { 
     //Null check makes sure the main page is attached to the event 
     if (this.ButtonClicked != null) 
      this.ButtonClicked(this, new RoutedEventArgs()); 
     Debug.WriteLine("ButtonClickedHandler"); 
     } 
    } 

MainPage.xaml.cs

private void MyButton_Click(object sender, RoutedEventArgs e) 
     { 
      Debug.WriteLine("MyButton_Click"); 
     } 

     private void MyButton_Loaded(object sender, RoutedEventArgs e) 
     { 
      (sender as MyButton).ButtonClicked += MyButton_Click; 
     } 

クラスでありますDebug.WriteLineのカップルですが、それらは誘発されず、私は何が間違っているのか分かりません。

+1

あなたが呼ぶのですか'ButtonClickedHandler()'? – zockDoc

+0

Yip、@ zockDocは 'ButtonClickedHandler()'を呼び出すのを忘れてしまったようです。 –

+0

ええ、しかし、ポイントは[リンク内]でした(http://stackoverflow.com/questions/6192739/how-do-i-raise-an-event-in-a-usercontrol-and-catch-it- in-mainpage)を非公開にしますか? とにかく、 'Debug.WriteLine(" MyButton_Click ");'はトリガされません。 –

答えて

1

あなたのコードには何も呼び出されないメソッドが1つしかないので、プログラムは動作しません。ボタンをクリックするたびにButtonClickedHandler()メソッドに電話する必要があります。
これを行うには、ボタンのクリックイベントのメソッドをxamlファイルに登録するだけです。

<Button Content="This Is Your Button" Click="YourButtonClick"/> 

そしてそこにButtonClickedHandler()メソッドを呼び出します。

private void YourButtonClick(object sender, RoutedEventArgs e) { 
    ButtonClickedHandler(); 
} 

問題を解決するための簡単な方法は、イベントプロパティ使用している:

UserControl.xaml.csを

public Event RoutedEventHandler ButtonClicked 
{ 
    add { 
     ButtonName.Click += value; //use the name of your button here 
    } 
    remove { 
     ButtonName.Click -= value; 
    } 
} 

そして、あなたは単純にあなたのメインウィンドウでそのイベントに登録します

private void MyButton_Loaded(object sender, RoutedEventArgs e) 
{ 
    (sender as MyButton).ButtonClicked += MyButton_Click; 
} 

ちなみに、私はあなたがまた、コントロールを作成し、XAMLファイル内のイベントを登録した方がよいと思う:

+0

あなたが言ったように私はUserControlを編集しました。しかし、私はまだ操作の順序を再構築しようとしています。 最初に 'MyButton'が作成され、ロードされると、' MyButton_Click'という名前のeventHandlerがButtonClickedプロパティに登録されます。 UserControl内の 'Button'(' ButtonControl'と呼ぶ)にはClickプロパティ、 'YourButtonClick'があります。これは、 'ButtonClickedHandler()'を呼び出し、 'HandlerButtonClicked(this、new RoutedEventArgs()) 'で新しいHandlerを' ButtonClicked'に追加します。「MyButton_Click」が登録されました。これは正しいです? –

+1

ほぼ'MyButton_Click'はこの行を実行した瞬間から既に登録されています:'(SendButton as MyButton).ButtonClicked + = MyButton_Click; ' しかし、それは取得するイベントと同じではない' ButtonClicked'イベントにのみ登録されますボタンをクリックすると発生します。もう一方のHandのメソッドYourButtonClick(オブジェクト送信者、RoutedEventArgs e)は、コントロール内のButtonに登録されています。ボタンがクリックされると、ボタンが実行され、 'ButtonClickedHandler()'が呼び出され、最後に 'ButtonClicked'イベントが発生し、メソッド' MyButton_Click'が呼び出されます。 – zockDoc

+1

この手順を理解するには、プログラムの先頭と、 'private void YourButtonClick(object sender、RoutedEventArgs e)'の先頭にブレークポイントを置く方法があります。 F11キーを使用すると、正確に何が起こっているのかを段階的に確認することができます。 – zockDoc

関連する問題