我正在为图表内容实现'光标下的值'读数。目前,我正在使用ReactiveExtensions实现此目的,并在我的图表背景网格上订阅GetMouseMove事件:
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回调要么设置位置。
我还尝试在基于Mouse.GetPosition(m_PlotArea)更改我的模型的通知时手动设置readoutTextBlock,但遇到了线程问题(模型在单独的线程中更新)以及m_PlotArea的命中测试问题。
有什么建议吗?
答案 0 :(得分: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(...));