2010-08-27 129 views
3

我正在为图表内容实现'光标下的值'读数。目前我实现这一使用ReactiveExtensions和订阅的GetMouseMove事件对我的图表背景网格:如何手动触发固定鼠标的MouseMove事件

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); 
     } 
    ); 
} 

而且工作正常。我可以移动鼠标并更新我的文本块。

问题是图表内容正在动态更新(在屏幕上移动)。如果我将鼠标光标固定在点上,它下面的内容会改变,但显然读取不会更新。

我试图通过光标位置设置到其自身手动触发鼠标移动,只要在该模型中的数据进行了更新:

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);  
} 

这并不会触发回调。将位置设置为(X-1,Y-1)DID会触发回调,但如果立即将像素设置回原始位置(后续的X + 1,Y + 1),则不会触发mousemove回调任一位置设置。

我也尝试手动设置readoutTextBlock通知我的模型基于Mouse.GetPosition(m_PlotArea)更改但遇到线程问题(模型更新在单独的线程中)以及m_PlotArea命中测试问题。

有什么建议吗?

回答

2

我认为这将是更清洁的使用单独的事件源。现在

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

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

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

可以强制事件处理:

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

这是一个很好的清洁方法来合并事件。它并不完全是我以前的样子,但它比我实施的破解更加简洁。干杯 – 2010-08-31 01:40:46