C# 使用onMouseMove事件时DrawingVisual跟随光标的性能问题
我正忙于一个小应用程序,在这个应用程序中,当光标在画布上移动时,我想在光标的位置显示信息。讨论中的画布是一个自定义画布(继承自画布),它提供了添加DrawingVisuals的功能(基本上在关于在画布上显示大量几何图形的每个教程中都有显示) 我想显示一条垂直线和水平线,以及直接从画布坐标(v)导出的局部坐标(下面代码中的p)。目前,我正在渲染这些对象的位置(0,0),并在OnMouseMove事件期间使用偏移量来更新它们的位置 水平线和垂直线在DrawingVisualU光标中呈现,位置在本地y、z坐标中在_信息中呈现C# 使用onMouseMove事件时DrawingVisual跟随光标的性能问题,c#,wpf,user-interface,onmousemove,C#,Wpf,User Interface,Onmousemove,我正忙于一个小应用程序,在这个应用程序中,当光标在画布上移动时,我想在光标的位置显示信息。讨论中的画布是一个自定义画布(继承自画布),它提供了添加DrawingVisuals的功能(基本上在关于在画布上显示大量几何图形的每个教程中都有显示) 我想显示一条垂直线和水平线,以及直接从画布坐标(v)导出的局部坐标(下面代码中的p)。目前,我正在渲染这些对象的位置(0,0),并在OnMouseMove事件期间使用偏移量来更新它们的位置 水平线和垂直线在DrawingVisualU光标中呈现,位置在本地y
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事件似乎会产生大量开销,我可以看到,当我快速移动鼠标时,跟踪鼠标移动会出现问题
有人能推荐一种更好的方法来创造同样的效果吗
编辑:
我进一步研究了一下,当画布的分辨率更大时,问题似乎就出现了。如果它是600x400画布,那么就没有延迟,但是当它在1000x800左右时,我会在胡闹时遇到延迟问题。如果我使用用户绘制的十字准线,而不是画布全宽/全高的线条,性能也会提高。我最近构建了类似的东西,没有任何性能问题。 通过直接在画布上添加内容,以非常简单的方式完成。 绘制的项目位于鼠标位置画布后面的第二个画布中。两者都位于网格中。 这肯定不是解决这个问题的最复杂的方法,但对我来说效果很好 代码如下:
private Point _previous;
private Point _current;
private Line _xLine;
private Line _yLine;
private TextBlock _displayTextBlock;
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
_current = e.GetPosition(myCanvas);
if (_previous != _current)
{
if (_xLine == null)
{
_xLine = new Line() {X1 = 0, X2 = myCanvas.ActualWidth, Stroke = new SolidColorBrush(Colors.Black)};
_yLine = new Line() {Y1 = 0, Y2 = myCanvas.ActualHeight, Stroke = new SolidColorBrush(Colors.Black)};
_displayTextBlock = new TextBlock();
myCanvas.Children.Add(_xLine);
myCanvas.Children.Add(_yLine);
myCanvas.Children.Add(_displayTextBlock);
}
_displayTextBlock.SetValue(Canvas.TopProperty, _current.Y);
_displayTextBlock.SetValue(Canvas.LeftProperty, _current.X);
_displayTextBlock.Text = _current.X.ToString() + " | " + _current.Y.ToString();
_xLine.Y1 = _current.Y;
_xLine.Y2 = _current.Y;
_yLine.X1 = _current.X;
_yLine.X2 = _current.X;
_previous = _current;
}
}
我最近构建了类似的东西,没有任何性能问题。 通过直接在画布上添加内容,以非常简单的方式完成。 绘制的项目位于鼠标位置画布后面的第二个画布中。两者都位于网格中。 这肯定不是解决这个问题的最复杂的方法,但对我来说效果很好 代码如下:
private Point _previous;
private Point _current;
private Line _xLine;
private Line _yLine;
private TextBlock _displayTextBlock;
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
_current = e.GetPosition(myCanvas);
if (_previous != _current)
{
if (_xLine == null)
{
_xLine = new Line() {X1 = 0, X2 = myCanvas.ActualWidth, Stroke = new SolidColorBrush(Colors.Black)};
_yLine = new Line() {Y1 = 0, Y2 = myCanvas.ActualHeight, Stroke = new SolidColorBrush(Colors.Black)};
_displayTextBlock = new TextBlock();
myCanvas.Children.Add(_xLine);
myCanvas.Children.Add(_yLine);
myCanvas.Children.Add(_displayTextBlock);
}
_displayTextBlock.SetValue(Canvas.TopProperty, _current.Y);
_displayTextBlock.SetValue(Canvas.LeftProperty, _current.X);
_displayTextBlock.Text = _current.X.ToString() + " | " + _current.Y.ToString();
_xLine.Y1 = _current.Y;
_xLine.Y2 = _current.Y;
_yLine.X1 = _current.X;
_yLine.X2 = _current.X;
_previous = _current;
}
}
当您将属性设置为a而不是使用偏移量时,它的行为如何?感谢您的快速响应,但不幸的是,
TranslateTransform
将属性设置为a而不是使用偏移量时,它的行为如何?感谢您的快速响应,但不幸的是,TranslateTransform
没有任何改进,非常感谢。您的回复与我发现涉及屏幕分辨率的问题相结合,解决了我的问题。在我的原始光标对象中,水平线和垂直线都被绘制出来。显然(我可能错了)边界框决定了WPF想要重画什么(或检查覆盖)。所以我通过使用两个光标对象解决了这个问题,一个用于水平线,一个用于垂直线。非常感谢。您的回复与我发现涉及屏幕分辨率的问题相结合,解决了我的问题。在我的原始光标对象中,水平线和垂直线都被绘制出来。显然(我可能错了)边界框决定了WPF想要重画什么(或检查覆盖)。因此,我通过使用两个光标对象修复了这个问题,一个用于水平线,另一个用于垂直线。