2010-08-27 9 views
3

Je suis en train d'implémenter une lecture de "valeur sous le curseur" pour le contenu de la carte. Actuellement, je suis en utilisant ce ReactiveExtensions réalisais et inscrivez-vous à l'événement GetMouseMove sur mon arrière-plan graphique Grille:Comment déclencher manuellement un événement MouseMove pour une souris fixe

private void SetupMouseover(Grid plotArea) 
{ 
    var mouseMove = from mo in plotArea.GetMouseMove() 
         select new 
         { 
          CurrentPos = mo.EventArgs.GetPosition(plotArea) 
         }; 

    mouseMove.Subscribe(
     item => 
     { 
      // Update the readout contents 
      readoutTextBlock.Text = PositionToReadoutValue(item.CurrentPos); 
     } 
    ); 
} 

Et ça fonctionne bien. Je peux déplacer ma souris et mettre à jour mon bloc de texte.

Le problème est que le contenu de la carte est mis à jour dynamiquement (en se déplaçant sur l'écran). Si je laisse le curseur de la souris stationnaire sur le point, le contenu en dessous change (mais évidemment) l'affichage n'est pas mis à jour.

je tenté de déclencher manuellement le déplacement de la souris en réglant la position du curseur sur lui-même chaque fois que les données du modèle a été mis à jour:

private void MoveCursor() 
{ 
    // move the mouse cursor 0 pixels 
    System.Windows.Forms.Cursor.Position = new System.Drawing.Point(System.Windows.Forms.Cursor.Position.X, 
                    System.Windows.Forms.Cursor.Position.Y);  
} 

Cela n'a pas déclenché le rappel. Définir la position à être (X-1, Y-1) DID déclencher le rappel, mais si je remets immédiatement le pixel à l'emplacement d'origine (X + 1, Y + 1), cela ne déclenche pas le rappel de mousemove pour Position définie. J'ai également essayé de définir manuellement readoutTextBlock sur la notification de mon modèle modifié en fonction de Mouse.GetPosition (m_PlotArea), mais j'ai rencontré des problèmes de threads (le modèle est mis à jour dans un thread séparé) et aussi des problèmes de test avec m_PlotArea.

Des suggestions?

Répondre

2

Je pense que ce sera plus propre à utiliser une source d'événements séparée.

IObservable<Position> mouseMove = GetMouseMove(); // stream of MouseMove events 

IObservable<Position> manualTrigger = new Subject<Position>(); 

var positionChange = mouseMove.Merge(manualTrigger); 
positionChange.Subscribe(pos => ...); 

Maintenant, vous pouvez forcer le traitement des événements:

manualTrigger.OnNext(new Position(...)); 
+0

C'est une belle manière propre à amalgamer les événements. Ce n'est pas exactement ce que je recherchais, mais c'est un moyen plus propre que le hack que je mettais en place. À votre santé –