2010-08-27 182 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