2016-08-10 3 views
0

Ich habe eine benutzerdefinierte UserControl erstellt, es ist ein Knopf mit einem Gitter drin.Ereignis sprudelt in UserControl in C#

Von der Seite, die es enthält, MainPage.xaml, ich brauche ein Click Ereignis an das Benutzersteuerelement zu binden, und die Funktion für die EventHandler muss außerhalb geschrieben werden, in der Mainpage (nicht im Usercontrol).

Also, durch this question lesen, habe ich eine Event und eine EventHandler-Funktion erstellt, die das Ereignis auslöst. Diese befinden sich im UserControl. Dies sind die Klassen

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; 
     } 

Wie Sie sehen können, habe ich platziert ein Paar von Debug.WriteLine, aber sie werden nicht ausgelöst, und ich weiß nicht, was ich falsch mache.

+1

Haben Sie jemals rufen 'ButtonClickedHandler()'? – zockDoc

+0

Yip, @ zockDoc ist nach dem Aussehen der Dinge, die Sie vergessen haben, die 'ButtonClickedHandler()' aufzurufen. –

+0

Ja, aber was war der Punkt [in der Verbindung] (http://stackoverflow.com/questions/6192739/how-do-i-raise-an-event-in-a-usercontrol-and-catch-it- in-mainpage) um es dann privat zu machen? Anyway, 'Debug.WriteLine (" MyButton_Click ");' wird nicht ausgelöst. –

Antwort

1

Wenn Sie nur eine einzige Methode in Ihrem Code haben, die nie aufgerufen wird, wird Ihr Programm nicht funktionieren. Sie müssen die Methode ButtonClickedHandler() jedes Mal aufrufen, wenn Sie auf die Schaltfläche klicken.
Um dies zu tun, registrieren Sie einfach eine Methode für das Click-Ereignis Ihrer Schaltfläche in Ihrer XAML-Datei.

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

Und dann rufen Sie die ButtonClickedHandler() Methode dort:

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

Ein einfacher Weg, um das Problem zu lösen, wird mit Hilfe einer Ereigniseigenschaft:

UserControl.xaml.cs

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

Und dann können Sie einfach registrieren zu diesem Ereignis in Ihrem Mainwindow:

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

By the way, ich denke, es ist besser, das Ereignis in der XAML-Datei zu registrieren, wo Sie auch die Steuerung erstellen:

+0

Ich habe das UserControl wie du gesagt bearbeitet, und jetzt funktioniert es! Ich versuche jedoch immer noch, die Reihenfolge der Operationen zu rekonstruieren. Zuerst wird 'MyButton' erstellt, und beim Laden wird ein eventHandler namens' MyButton_Click' in der ButtonClicked-Eigenschaft registriert. Der 'Button' im UserControl (nennen wir ihn' ButtonControl') hat eine Click-Eigenschaft, 'YourButtonClick'. Dies ruft 'ButtonClickedHandler()' auf, das einen neuen Handler zu 'ButtonClicked' hinzufügt und' this.ButtonClicked (this, new RoutedEventArgs()) ''.'MyButton_Click' ist jetzt registriert. Ist das richtig? –

+1

Fast. 'MyButton_Click' ist bereits bei der Ausführung dieser Zeile registriert:' (sender as MyButton) .ButtonClicked + = MyButton_Click; ' Es ist jedoch nur für das' ButtonClicked' -Ereignis registriert, das nicht mit dem Ereignis übereinstimmt, das abgerufen wird ausgelöst, wenn der Button innerhalb angeklickt wird. Die Methode 'YourButtonClick (Objekt-Absender, RoutedEventArgs e)' andererseits wird für den Button innerhalb des Controls registriert. Wenn also die Schaltfläche angeklickt wird, wird sie ausgeführt, ruft "ButtonClickedHandler()" auf, was schließlich das "ButtonClicked" -Ereignis auslöst und die Methode "MyButton_Click" aufruft. – zockDoc

+1

Ein einfacherer Weg, die Prozedur zu verstehen, ist das Setzen eines Breakpoints am Anfang des Programms und zu Beginn von 'private void YourButtonClick (Objekt-Absender, RoutedEventArgs e)'. Mit der Taste F11 können Sie dann Schritt für Schritt sehen, was genau passiert. – zockDoc

Verwandte Themen