passage d'Arguments d'Événement d'origine du gestionnaire d'Événement Routé dans wpf
Le code suivant montre un événement normal et un événement routé. Ici, j'ai utilisé le même nom de l'événement pour expliquer, mais en réalité, je suis juste en utilisant l'événement routé.
//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); }
}
Que je soulève ces événements à partir d'un couple de gestionnaires d'événements comme suit
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);
}
Quand je suis à la manipulation de l'Événement normal, je suis en mesure d'envoyer des arguments à la fois les gestionnaires de l'événement, mais dans l'Événement Routé le args sera une nouvelle instance. Je veux passer les arguments à la fois les gestionnaires de l'Événement Routé. Est-il possible de réaliser cela? Si oui, alors comment?
OriginalL'auteur samar | 2010-12-21
Vous devez vous connecter pour publier un commentaire.
tout d'abord, vous n'avez pas besoin de cela (et faut l'enlever):
c'est à dire que vous n'avez pas besoin de définir un "normal" de l'événement, parce que vous l'avez déjà fait avec cette déclaration:
avec le bloc de code ci-dessus, vous êtes "l'habillage" de l'événement routé avec un "normal" (clr), ainsi l'utilisateur de cette classe peut l'utiliser avec le "normal" de la syntaxe (c'est à dire
instanceOfMyUserControl.Selected += ....
)deuxièmement, si vous voulez les arguments de l'événement de votre événement routé à être les mêmes que ceux de la
SelectionChanged
cas de laListView
vous écoutez, vous devez déclarer votre événement routé de cette façon:Avis que j'ai remplacé le
RoutedEventHandler
avecSelectionChangedEventHandler
, comme c'est le prédéfini qui permet de "transporter"SelectionChangedEventArgs
.Maintenant à la hauteur de l'événement.
Vous n'avez pas besoin d'augmenter à la fois la "normale" et la routé (comme le "normal" est un wrapper pour le routage), de sorte que vous devriez supprimer cette:
et augmentent seulement la routé version, ce qui peut être fait de cette façon:
Avis que je suis en utilisant les arguments de l'événement à partir de l'origine de l'événement pour définir la
AddedItems
etRemovedItems
de l'personnalisés.ah, devrait avoir vérifié le constructeur par défaut, merci pour elle.
Je ne comprends pas votre question (3), afin d'augmenter votre événement routé vous avez juste à construire votre SelectionChangedEventArgs, peut-être que vous pouvez élaborer un peu ?
Je ne parle pas de sensibilisation de l'événement. Je voulais dire que comment puis-je PASSER le EventArgs de deux des gestionnaires différents à un seul événement si EventArgs de la 2 les gestionnaires sont-ils différents? Par exemple dans notre cas, si le "Sélectionné" RoutedEvent est posée à partir de 2 gestionnaires. 1 gestionnaire est d'avoir à dire SelectionChangedEventArgs et l'autre est d'avoir à dire MouseButtonEventArgs alors comment puis-je passer le EventArgs Sélectionné RoutedEvent? J'espère que je suis clair maintenant?
eh bien, tout d'abord définir vos intentions, c'est à dire ce qui est censé se produire lorsque vous recevez (disons) "MouseDown" de l'événement. Si cela signifie que vous ajoutez un élément à la sélection et à la suppression de l'un, de construire les arguments de cette façon - nouvelle SelectionChangedEventArgs(SelectedEvents, new object[]{supprimé}, new object[]{ajoutée}). Si cela signifie que vous ne fait qu'ajouter à la sélection - déclencher l'événement avec ces arguments - nouvelle SelectionChangedEventArgs(SelectedEvents, Énumérable.Vide<object>(), new object[]{ajoutée}) et ainsi de suite.
OriginalL'auteur xenry
À suivre sur votre dernier commentaire (peut-on donner un lien vers un commentaire particulier ?) Je vais écrire une autre réponse afin que les gens peuvent suivre.
Je pense qu'il vous manque le point des événements tout à fait. Que voulez-vous, le gestionnaire de votre événement afin de savoir quand il reçoit? C'est généralement le but des arguments de l'événement - vous passer un peu d'info pour le gestionnaire avec qui vous donner quelques explications sur ce qui s'est exactement passé.
Donc la première fois que vous soulevez votre événement, vous pourrez le faire de cette façon:
Vous devez d'abord construire les arguments et ensuite utiliser le
RaiseEvent()
fonction avec les arguments, parce que vous voulez faire un wpf spécial acheminé type d'événement. Les arguments doivent être une instance d'une classe qui hérite de RoutedEventArgs. Notez que vous êtes en train de construireSelectionChangedEventArgs
qui sont définis dans wpf pour "transporter" des informations supplémentaires pour le gestionnaire de l'événement - à savoir les éléments qui ont été supprimés de la sélection, et qui ont été ajouté, de sorte que lorsque le gestionnaire reçoit l'événement, il peut utiliser info si il veut.À propos de cette pense que vous faites:
fondamentalement, - (comme je l'ai dit dans ma première réponse) enlever, vous n'en avez pas besoin.
Donc ce qui vous dérange est la deuxième fois que vous êtes à élever l'événement. C'est un prototype de ce que vous avez à faire:
comme vous le voyez, encore une fois, vous avez à construire la
SelectionChangedEventArgs
et l'utilisation de laRaiseEvent()
fonction pour déclencher l'événement. Mais cette fois, vous ne pouvez pas utilisere.RemovedItems
ete.AddedItems
, parce que vous êtes la manipulation d'unMouseLeftButtonUp
événement, qui (par l'intermédiaire de son args) contient de l'information sur l'état de la souris - pas ce que les articles ont été ajoutés à la sélection (après un événement de souris, pas un événement de sélection).Vous devez décider par quoi remplacer les deux points d'interrogation - comme je l'ai dit dans les commentaires à la première réponse, vous aurez à décider quelles sont les informations que vous voulez transmettre à l'utilisateur de votre événement. Ce qui signifie que le bouton de la souris n'est plus sur la "lstvMyView"? La chose la plus simple à faire est ceci:
avec qui vous êtes à élever l'événement et qui dit à ses consommateurs qu'aucun des éléments ont été retirés de la sélection et aucun élément n'a été ajouté.
non, vous ne sont pas correctes - vous pouvez passer "MouseButtonEventArgs" tandis que la hausse de l'événement, qui est déclarée avec des arguments de type "RoutedEventArgs". Mais votre routé "SelectedEvent" est déclarée avec des arguments de type "SelectionChangedEventArgs" et ainsi vous ne pouvez pas utiliser "MouseButtonEventArgs".
Mais dans ma question mentionnée ci-dessus l'événement routé "SelectedEvent" a des arguments de type "RoutedEventArgs". Pour en revenir à votre réponse, je suppose qu'il ne sera pas possible de passer "SelectionChangedEventArgs" ou "MouseButtonEventArgs" à l'événement. Ai-je raison en disant cela?
OriginalL'auteur xenry