übergabe-Event Argumente der original-handler Weitergeleitet Veranstaltung in wpf
Folgende code zeigt ein normales Ereignis und ein routed event. Hier habe ich das gleiche Ereignis-name für die Erklärung Zwecke, aber in Wirklichkeit bin ich nur mit den routed event.
//Normal Event
public event SelectedHandler Selected;
public delegate void SelectedHandler(Object Sender, RoutedEventArgs e);
//Routed Event
public static readonly RoutedEvent SelectedEvent =
EventManager.RegisterRoutedEvent(
"Selected", RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(MyUserControl));
//add remove handlers
public event RoutedEventHandler Selected
{
add { AddHandler(SelectedEvent, value); }
remove { RemoveHandler(SelectedEvent, value); }
}
Ich Hebe diese Ereignisse von ein paar event-Handler wie folgt
private void lstvMyView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//Normal Event Raise
if (Selected != null)
Selected(this, e);
//Routed Event Raise
RoutedEventArgs args = new RoutedEventArgs(SelectedEvent);
RaiseEvent(args);
}
private void lstvMyView_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
//Normal Event Raise
if (Selected != null)
Selected(this, e);
//Routed Event Raise
RoutedEventArgs args = new RoutedEventArgs(SelectedEvent);
RaiseEvent(args);
}
Wenn ich die Handhabung der normalen Ereignis ich bin in der Lage, senden Sie die Argumente der beiden Handler für das Ereignis selbst, sondern in Routed Event args wird eine neue Instanz. Ich will übergeben Sie die Argumente der beiden Handler, die auf die weitergeleitete Ereignis. Ist es möglich, dies zu erreichen? Wenn ja, dann wie?
InformationsquelleAutor samar | 2010-12-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
erste von allen, die Sie nicht brauchen (und sollten Sie es entfernen):
d.h. Sie brauchen nicht, um die Definition eines eigenen "normalen" Veranstaltung, denn Sie haben es bereits getan, mit dieser Erklärung:
mit dem oben genannten code-block, den Sie sind, "Verpacken" die weitergeleitete Ereignis mit einem "normalen" (clr), damit die Benutzer Ihrer Klasse verwenden können, es mit der "normalen" syntax (d.h.
instanceOfMyUserControl.Selected += ....
)Sekunde, wenn Sie wollen, dass die event-Argumente von Ihr weitergeleitet Veranstaltung zu werden, die gleichen wie diejenigen der
SelectionChanged
Veranstaltung derListView
Sie hören zu, Sie sollten erklären, Ihren geroutet Veranstaltung auf diese Weise:Beachten Sie, dass ich ersetzte die
RoutedEventHandler
mitSelectionChangedEventHandler
, wie es ist, die vordefinierten kann, dass er "tragen"SelectionChangedEventArgs
.Nun für den Anstieg von der Veranstaltung.
Sie brauchen nicht zu steigen sowohl die "normalen" und weitergeleitet (wie der "normale" ist ein wrapper für die geroutet), so löschen Sie diese:
und steigen, nur die gerouteten version, die getan werden kann, auf diese Weise:
Beachten Sie, dass ich über die event-Argumente aus dem ursprünglichen Ereignis, um die
AddedItems
undRemovedItems
von der eine benutzerdefinierte ein.ah, ich sollte überprüft haben, die default-Konstruktor, danke für den Hinweis it out.
Ich kann nicht verstehen, Ihre Frage (3), um zu erhöhen Ihre geroutet Veranstaltung, die Sie gerade haben, um zu bauen Ihre SelectionChangedEventArgs, vielleicht können Sie aufwendige ein bisschen auf ?
Ich spreche nicht über die Anhebung der Veranstaltung. Ich meinte, wie kann ich PASS den EventArgs zwei verschiedene Handler für ein einzelnes Ereignis aus, wenn die EventArgs des 2-Handlern anders? Zum Beispiel in unserem Fall, wenn der "Ausgewählte" RoutedEvent wird immer ausgelöst von 2 Handler. 1-handler ist mit sagen, SelectionChangedEventArgs und die andere ist mit sagen, MouseButtonEventArgs dann, wie kann ich pass den EventArgs die Ausgewählten RoutedEvent? Ich hoffe ich bin jetzt klar?
nun, zunächst definieren Sie Ihre Absichten, d.h. was soll geschehen, wenn Sie zu erhalten (sagen wir) "MouseDown" - Ereignis. Wenn das bedeutet, dass Sie fügen Sie ein Element, um die Auswahl und entfernen eines konstruieren Sie die Argumente in dieser Art und Weise - neue SelectionChangedEventArgs(SelectedEvents, new object[]{entfernt}, new object [] {}). Wenn es bedeutet, dass Sie nur hinzufügen, um die Auswahl - das Ereignis auslösen, mit diesen args - neue SelectionChangedEventArgs(SelectedEvents, Durchlaufen werden.Leer<object>(), new object [] {}) und so weiter.
InformationsquelleAutor xenry
Folgen in Ihrem letzten Kommentar (kann man einen link auf einen bestimmten Kommentar ?) Ich Schreibe eine weitere Antwort, damit die Leute Folgen können.
Ich denke, Sie sind fehlt den Punkt der Ereignisse insgesamt. Was willst du den handler für das Ereignis, zu wissen, Wann Sie empfangen wurde? Das ist in der Regel der Zweck der Ereignis-Argumente - Sie passieren einige info zu den handler, mit denen Sie einige Hintergrundinformationen, was genau passiert ist.
Also das erste mal, wenn Sie erhöhen Ihre Veranstaltung, Sie werden es so machen:
Müssen Sie zunächst die zur Konstruktion der Argumente und verwenden Sie dann die
RaiseEvent()
Funktion mit, dass Argumente, denn Sie möchte ein wpf spezielle geroutet Art von Veranstaltung. Die Argumente haben, um eine Instanz einer Klasse, die erbt, RoutedEventArgs. Beachten Sie, dass Sie bauenSelectionChangedEventArgs
den in wpf zu "tragen" zusätzliche Informationen an den Ereignishandler des Ereignisses - nämlich die items wurden aus der Auswahl entfernt und welche Hinzugefügt wurden, sodass, wenn der handler das Ereignis empfängt Sie verwenden können, die info, wenn er will.Über diese denke, man tut:
grundsätzlich - (wie ich schon in meiner ersten Antwort) entfernen, die Sie nicht brauchen.
So, was stört Sie ist das zweite mal, Sie heben das Ereignis. Dies ist ein Prototyp von dem, was Sie zu tun haben:
wie Sie sehen, wieder müssen Sie zum erstellen der
SelectionChangedEventArgs
und verwenden Sie dieRaiseEvent()
- Funktion, um das Ereignis auslösen. Aber diese Zeit, die Sie nicht verwenden könnene.RemovedItems
unde.AddedItems
, weil Sie mit einerMouseLeftButtonUp
Ereignis, dass (über den args) enthält Informationen über die Maus - Zustand-nicht das, was Elemente wurden Hinzugefügt, um die Auswahl (immerhin ist es ein Maus-Ereignis, nicht ein Auswahl-Ereignis).Sie haben zu entscheiden, mit was Sie zu ersetzen die zwei Fragezeichen - als ich sagte in den Kommentaren auf die erste Antwort, die Sie haben zu entscheiden, welche Informationen Sie vermitteln wollen, die Benutzer Ihrer Veranstaltung. Was bedeutet, dass die Maus-Taste nicht mehr unten auf die "lstvMyView"? Die einfachste Sache zu tun, ist dies:
mit denen Sie heben das Ereignis und erzählt seine Verbraucher, die keine Elemente wurden aus der Auswahl entfernt und keine Elemente Hinzugefügt wurden.
Nein, Sie sind nicht richtig, Sie können passieren "MouseButtonEventArgs" beim aufstehen Veranstaltung, die erklärt wird mit args vom Typ "RoutedEventArgs". Aber Ihr weitergeleitet "SelectedEvent" deklariert wird mit args vom Typ "SelectionChangedEventArgs" und damit können Sie nicht verwenden "MouseButtonEventArgs".
Aber in meiner Frage oben erwähnt die weitergeleitete Ereignis "SelectedEvent" hat sich args vom Typ "RoutedEventArgs". So suchen Ihre Antwort-ich vermute, dass es nicht möglich sein, zu überholen "SelectionChangedEventArgs" oder "MouseButtonEventArgs" zu dem genannten Ereignis. Bin ich die richtige in die besagt das?
InformationsquelleAutor xenry