2010-12-22 15 views
2

Mein UserControl enthält eine Schaltfläche. Ich möchte, dass das Click-Ereignis der Schaltfläche an Benutzer von UserControl direkt von an weitergeleitet wird. Sie werden es als ein Ereignis namens "ButtonClick" sehen.Weitergabe von Ereignissen aus einem Kindsteuerelement von UserControl - direkteste Methode?

public event RoutedEventHandler ButtonClick 
{ 
    add { _button.Click += value; } 
    remove { _button.Click -= value; } 
} 

Dieser Ansatz funktioniert nicht. Ich habe den Handler für ButtonClick im Client-Code hinzugefügt, aber durch Klicken auf die Schaltfläche wird er dort nicht aufgerufen.

Ich vermisse etwas einfach, weil ich noch neu bei WPF bin.

Antwort

0

Das Button Click-Ereignis ist ein Routingereignis, das bedeutet, dass es sich in der visuellen Struktur Ihrer Anwendung auf und ab bewegt. Dies bedeutet, dass jedes Elternelement Ihrer Schaltfläche dieses Ereignis verarbeiten kann. Daher müssen Sie nicht Ihre eigene Logik hinzufügen, um dies zu unterstützen, d. H. Ihr Code ist redundant!

Im Folgenden finden Sie, wie Sie eine Prozedur für dieses Routingereignis registrieren:

http://msdn.microsoft.com/en-us/library/ms742806.aspx#event_handing

Colin E.

+0

Aber ist es dann nicht seltsam, dass ein Elternteil (standardmäßig) auf diese eher interne Information zugreifen kann? Außerdem befindet sich das Benutzersteuerelement in einer anderen Assembly. Sicher, wenn das funktioniert, wird es mein Problem sowieso lösen. Vielen Dank. –

+0

Es funktioniert einfach nicht, weil ich über ein UserControl spreche, Sie haben das vielleicht verpasst. Gefällt mir nicht? (weil ich nicht kann) –

3

Sie haben die RoutedEvent registrieren:

public static readonly RoutedEvent ButtonClickEvent = EventManager.RegisterRoutedEvent(
    "ButtonClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl)); 

.. und dann verwenden Sie die Eigenschaft, um den neu registrierten Ereignishandler zu verwalten

public event RoutedEventHandler ButtonClick 
    { 
     add { AddHandler(ButtonClickEvent , value); } 
     remove { RemoveHandler(ButtonClickEvent , value); } 
    } 

Dann natürlich müssen Sie die Routed Ereignis erhöhen, wenn das Ereignis Click der Schaltfläche ausgelöst wird:

void button_Click(object sender, EventArgs e) 
{ 
    RaiseEvent(new RoutedEventArgs(ButtonClickEvent)); 
} 

Es ist ein paar Schritte von nur direkt Verdrahtung zu den nativen Ereignishandler der Schaltfläche, aber nicht so schlimm.

+0

Dies ist nicht so direkt, wie ich es mir erhofft hatte. –

Verwandte Themen