我正忙于一个小型应用程序,我想在光标悬停在画布上时在光标位置显示信息。有问题的 Canvas 是一个自定义的(继承自 Canvas),它提供了添加绘图视觉的功能(基本上每个教程中都显示了在画布上显示大量几何形状)。
我想显示一条垂直线和水平线以及直接从画布坐标(v)派生的局部坐标(下面代码中的p)。目前,我在位置 (0,0) 处渲染这些对象,并在 OnMouseMove 事件期间使用偏移量来更新它们的位置。
水平线和垂直线在 DrawingVisual _cursor 中呈现,在 _info 中的局部 y、z 坐标中呈现位置。
private void oCanvas_MouseMove(object sender, MouseEventArgs e)
{
#region 1. Get location data
System.Windows.Vector v = (System.Windows.Vector)e.GetPosition(oCanvas);
// point in YZ coordinates
BSMath.DoubleXY p = new BSMath.DoubleXY();
p.X = (oCanvas.OriginY - v.Y) / oCanvas.ZoomFactor;
p.Y = (oCanvas.OriginX - v.X) / oCanvas.ZoomFactor;
#endregion
#region 2. Update cursor and info
if (oSettings.ShowInformation)
{
_info.Info = p.X.ToString("0.0") + " | " + p.Y.ToString("0.0");
_info.Render(0, 0);
_info.Visual.Offset = v;
}
// move cursor
_cursor.Visual.Offset = v;
}
使用 mousemove 事件似乎会产生很多开销,我可以看到当我快速移动鼠标时跟踪鼠标移动存在问题。
谁能推荐一种更好的方法来产生相同的效果?
示例 http://www.iccg.be/test/images/canvas.jpg
编辑: 我进一步调查了它,当画布的分辨率更大时,问题似乎出现了。如果它是 600x400 画布,则没有延迟,但是当它在 1000x800 左右时,我会在悬停时遇到延迟问题。如果我使用用户绘制的十字准线而不是具有画布全宽/高度的线条,性能也会有所提高。