2009-03-15 11 views
2

Mit Reflector können Sie sehen, dass WPF UserControl AdjustBranchSource überschreibt.WPF intern: Warum überschreibt UserControl AdjustBranchSource?

internal override void AdjustBranchSource(RoutedEventArgs e) 
{ 

    e.Source = this; 

} 

Mein eigenes Problem betrifft Inkonsistenz, die durch dieses Problem verursacht wird. Wenn ein Element in einem Benutzersteuerelement oder außerhalb basiert. Der Source-Parameter verhält sich anders. Was mich verblüfft, die Quelle sollte immer das Zielelement des RoutedEvent sein.

Die Frage ist, warum wurde es so implementiert?

Antwort

3

Das ist irgendwie sinnvoll. Wenn Sie das UserControl als eine Blackbox behandeln, sollten Sie nicht wissen, welche Steuerelemente darauf und damit die Quelle eines Ereignisses sind.

Wenn Sie zwischen verschiedenen Schaltflächen auf dem UserControl unterscheiden müssen, sollte das UserControl eigene Ereignisse haben, die die Schaltflächen auslösen. Auf diese Weise sieht es von außen wie das richtige Ereignis aus und der Benutzer von UserControl muss nicht wissen, welcher Button welches Ereignis ausgelöst hat.

Um ein Beispiel zu geben, in einer Listbox, müssen Sie wissen, dass die Abwärts-Scroll-Taste war die Schaltfläche, die das ursprüngliche Ereignis gesendet? Oder müssen Sie nur wissen, dass ein Scroll-Down-Ereignis ausgelöst wurde.

1

Die Quelle eines Routingereignisses kann sich während des Routing des Ereignisses ändern. Ich bin nicht ganz sicher, warum UserControl ändert es, aber können Sie nicht nur die OriginalSource Eigenschaft auf RoutedEventArgs stattdessen verwenden?

+0

Ich könnte, es ist ein Schmerz. Sie erhalten den ButtonChrome oder ein anderes Element wie Teil. Danach müssen Sie das Element aus dem visuellen Baum ableiten. ist nicht schön. – ArielBH