私は小さなアプリケーションで忙しく、カーソルが Canvas の上を移動したときにカーソルの位置に情報を表示したいと考えています。問題の Canvas はカスタムのもの (Canvas から継承) で、DrawingVisuals を追加する機能を提供します (基本的に、キャンバスに大量の幾何学的形状を表示するすべてのチュートリアルで示されているように)。
キャンバス座標 (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 前後の場合、フーバー時に遅延の問題が発生します。キャンバスの全幅/高さを持つ線の代わりにユーザーが描いた十字線を使用すると、パフォーマンスも向上します。