2014-05-21 1 views
5

La RoutedEvent classe définit statiques UIElement membres MouseLeftButtonDownEvent et MouseLeftButtonUpEvent - mais il n'y a pas MouseMoveEvent. Pour autant que je sache, aucune classe ne figure dans la hiérarchie du framework. Il y a la définition d'événement régulier:Pourquoi est-il pas mouseMoveEvent - ou, comment utiliser AddHandler pour l'événement de déplacement de la souris

public event MouseEventHandler MouseMove; 

Vous pouvez donc écrire:

void AttachHandler(UIElement element) 
{ 
    element.MouseMove += OnMouseMove; 
} 

mais vous ne pouvez pas utiliser l'autre forme, ce qui vous permet de vous abonner à des événements, même traités:

void AttachHandler(UIElement element) 
{ 
    element.AddHandler(UIElement.MouseMoveEvent, new MouseEventHandler(OnMouseMove), true); 
} 

donc, ma question est double:

  1. Pourquoi n'y a-t-il aucun MouseMoveEvent défini quelque part?
  2. Existe-t-il une solution de contournement qui vous permet d'obtenir une notification pour les événements MouseMove même lorsqu'ils sont gérés?

Modifier

Je vois que the MSDN docs acknowledge this as a limitation:

Une limitation de cette technique est que l'API AddHandler prend un paramètre de type RoutedEvent qui identifie l'événement routé en question. Tous les événements routés Silverlight ne fournissent pas d'identificateur RoutedEvent, et cette considération affecte donc les événements routés qui peuvent encore être gérés dans le cas traité.

Edit # 2

par @HansPassant, la réponse générale est que les événements "MouseMove" ne peuvent pas être marqués comme "manipulés", donc ils ont toujours bulle. Cela est vrai pour la TextBox, à l'exception d'un cas de bordure apparent: lorsque vous cliquez sur la zone de texte de la TextBox, activant ainsi la fonction glisser-sélectionner, les événements "MouseMove" ne sont plus déclenchés. Je n'ai aucune idée de pourquoi cela serait.


Remarque - pour tous les curieux - je suis en train d'écrire un comportement qui permet à l'utilisateur de glisser/déposer une zone de texte. Le contrôle TextBox intercepte les événements de la souris par défaut, afin de permettre la sélection de texte.

+1

Vous pouvez utiliser 'UIElement.PreviewMouseMoveEvent'. –

+0

@HamletHakobyan bien, ça n'existe pas non plus, dans Silverlight. Je suppose que c'est juste une de ces fonctionnalités que Silverlight n'a pas. Je suis toujours curieux de savoir quelle serait la meilleure solution, le cas échéant. – McGarnagle

+0

oui, j'ai manqué tag. –

Répondre

3

Il est mentionné explicitement dans le MSDN article:

MouseMove ne peut pas être utilisé avec AddHandler parce qu'il n'y a pas manutentionnés ses données d'événement

Alors que cela répond à vos questions:

Pourquoi n'existe-t-il aucun objet MouseMoveEvent défini quelque part?

Parce qu'aucun n'est nécessaire.

Existe-t-il une solution de contournement qui vous permet d'obtenir une notification pour les événements MouseMove même lorsqu'ils sont gérés?

Vous n'en avez pas besoin, ils ne peuvent pas être manipulés et donc toujours des bulles. Le gestionnaire d'événement MouseMove de Windows les verra.

+0

Ah merci, j'ai raté ça. "Ils ont toujours une bulle" est vrai, sauf lorsque le curseur de sélection de texte est actif. C'est-à-dire, tant que le bouton gauche de la souris est enfoncé, les événements MouseMove ne se produisent pas. Un cas de bord évidemment ... pas clair pour moi pourquoi cela arrive, ou si c'est un bug. – McGarnagle

Questions connexes