2014-05-21 6 views
5

La classe UIElement definisce statici RoutedEvent membri MouseLeftButtonDownEvent e MouseLeftButtonUpEvent - ma non c'è MouseMoveEvent. Per quanto ne so, nemmeno una classe nella gerarchia del framework. V'è la definizione appuntamento fisso:Perché non compare alcuna MouseMoveEvent - o, come utilizzare AddHandler per l'evento del mouse mossa

public event MouseEventHandler MouseMove; 

Così si può scrivere:

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

, ma non è possibile utilizzare l'altra forma, che permette di iscriversi agli eventi, anche trattati:

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

Quindi la mia domanda è duplice:

  1. Perché non esiste un numero MouseMoveEvent definito da nessuna parte?
  2. Esiste una soluzione alternativa che consente di ricevere una notifica per gli eventi MouseMove anche quando vengono gestiti?

Modifica

vedo che the MSDN docs acknowledge this as a limitation:

Una limitazione di questa tecnica è che l'API AddHandler accetta un parametro di tipo RoutedEvent che identifica l'evento indirizzato in questione. Non tutti gli eventi di instradamento di Silverlight forniscono un identificatore RoutedEvent e questa considerazione influisce su quali eventi instradati possono ancora essere gestiti nel caso Handled.

Modifica # 2

Per @HansPassant, la risposta generale è che "MouseMove" eventi non possono essere contrassegnati come "gestito", così hanno sempre bolla. Questo è vero per il TextBox, eccetto per un caso di bordo apparente: quando fai clic sull'area di testo del TextBox, attivando così la cosa da trascinare per selezionare, gli eventi "MouseMove" non vengono più attivati. Non ho idea del perché sarebbe.


Nota - per chiunque sia curioso - Sto cercando di scrivere un comportamento che permette all'utente di drag/drop un TextBox. Il controllo TextBox intercetta gli eventi del mouse per impostazione predefinita, al fine di consentire la selezione del testo.

+1

È possibile utilizzare 'UIElement.PreviewMouseMoveEvent'. –

+0

@HamletHakobyan bene, che non esiste neanche, in Silverlight. Immagino che questa sia solo una di quelle funzioni che Silverlight non ha. Sono ancora curioso di sapere quale sarebbe la soluzione migliore, se esiste. – McGarnagle

+0

sì, ho perso il tag. –

risposta

3

Si è esplicitamente menzionato nella MSDN article:

MouseMove non può essere utilizzato con AddHandler perché non c'è Handled nei suoi dati degli eventi

In modo che risponde alle vostre domande:

Perché non è stato definito MouseMoveEvent da nessuna parte?

Perché nessuno è necessario.

Esiste una soluzione alternativa che consente di ricevere una notifica per gli eventi MouseMove anche quando vengono gestiti?

Non ne hai bisogno, non possono essere gestiti e quindi sono sempre in bolla. Il gestore di eventi WindowMove della finestra li vedrà.

+0

Ah grazie, mi è mancato. "Hanno sempre bolle" è vero, tranne quando è attiva la funzione di trascinamento selezione testo. Cioè, mentre il pulsante sinistro del mouse non funziona, non faccio borbottare gli eventi MouseMove. Un caso limite ovviamente ... non mi è chiaro il motivo per cui ciò accade, o se si tratta di un bug. – McGarnagle

Problemi correlati