evento - mouse down c#



Come può un controllo gestire un clic del mouse al di fuori di tale controllo? (3)

Sto scrivendo un controllo personalizzato e vorrei che il controllo passasse da uno stato di modifica allo stato normale quando un utente fa clic sul controllo. Sto gestendo l'evento LostFocus e questo aiuta quando un utente fa tabulazioni o se fa clic su un altro controllo che è Focusable. Ma se non fanno clic su qualcosa di Focusable, non uscirà dallo stato di modifica. Quindi ho due soluzioni in mente:

  • Passa all'albero in cima all'elemento più quando entra in uno stato di modifica e aggiungi un gestore per MouseDownEvent (e gestisci gli eventi "gestiti"). Nell'handler sposterò il controllo dal suo stato di modifica e rimuoverò il gestore dall'elemento più in alto. Questo sembra un po 'un trucco, ma probabilmente funzionerebbe bene.

Codice di esempio:

private void RegisterTopMostParentMouseClickEvent()
{
   _topMostParent = this.FindLastVisualAncestor<FrameworkElement>();
   if ( _topMostParent == null )
      return;
   _topMostParent.AddHandler( Mouse.MouseDownEvent, new MouseButtonEventHandler( CustomControlMouseDownEvent ), true );
}

private void UnRegisterTopMostParentMouseClickEvent()
{
   if ( _topMostParent == null )
      return;
   _topMostParent.RemoveHandler( Mouse.MouseDownEvent, new MouseButtonEventHandler( CustomControlMouseDownEvent ) );
   _topMostParent = null;
}
  • Usa Mouse.PreviewMouseDownOutsideCapturedElement e aggiungi un gestore al mio controllo. Nell'handler sposterò il controllo dal suo stato di modifica. Ma non sembra che l'evento abbia effetto. Quando viene avviato il mouse.PreviewMouseDownOutsideCapturedElement?

Codice di esempio:

AddHandler( Mouse.PreviewMouseDownOutsideCapturedElementEvent, new MouseButtonEventHandler( EditableTextBlockPreviewMouseDownOutsideCapturedElementEvent ), true );

https://ffff65535.com


Cattura il mouse. Quando un oggetto acquisisce il mouse, tutti gli eventi relativi al mouse vengono trattati come se l'oggetto con l'acquisizione del mouse eseguisse l'evento, anche se il puntatore del mouse si trova su un altro oggetto.


Di solito ottengo la finestra genitore e aggiungo un gestore di anteprime, anche se già gestito. A volte, quando MouseCapture non è abbastanza, questa tecnica è a portata di mano:

Window.GetWindow(this).AddHandler
(
    UIElement.MouseDownEvent,
    (MouseButtonEventHandler)TextBox_PreviewMouseDown,
    true
);

Mi avvicinerei a questo modo in un modo diverso: il modulo che contiene il controllo rimuove l'attenzione dal controllo quando un utente fa clic su un'altra parte del modulo.

Il fatto che il controllo abbia effettivamente perso la messa a fuoco è di gran lunga più semplice del tentativo di far sì che il controllo "simuli" l'attenzione sia perso in determinate situazioni, mentre in realtà non lo è. Tieni presente che, a meno che il controllo non abbia davvero perso il focus, accetterà comunque cose come l'input da tastiera.





mouseevent