Проблема производительности DrawingVisual после курсора при использовании события onMouseMove - PullRequest
1 голос
/ 27 февраля 2012

Я занят небольшим приложением, в котором я хочу отображать информацию в месте расположения курсора, когда он наводит курсор на холст.Рассматриваемый Canvas является пользовательским (унаследованным от Canvas), который предоставляет функциональные возможности для добавления DrawingVisuals (как показано в основном в каждом руководстве по отображению большого количества геометрических фигур на холсте).

Я хотел бы отобразитьвертикальная линия и горизонтальная линия, а также локальные координаты (p в коде ниже), которые напрямую выводятся из координат холста (v).В настоящее время я рендеринг этих объектов в позиции (0,0) и использовать смещение во время события OnMouseMove, чтобы обновить их местоположение.

Горизонтальные и вертикальные линии отображаются в DrawingVisual _cursor и расположение в локальнойy, z-координаты в _info.

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, у меня возникает проблема с задержками при работе с пылесосом.Производительность также улучшается, если я использую нарисованные пользователем перекрестия вместо линий, которые имеют полную ширину / высоту холста.

1 Ответ

1 голос
/ 28 февраля 2012

Недавно я создал нечто подобное, и у меня не было проблем с производительностью.Сделал это очень простым способом, добавив материал прямо на холст.Рисованные элементы находятся во втором холсте за холстом позиции мыши.Оба проживают в сетке.Это, конечно, не самый сложный способ решить эту проблему, но он работает довольно хорошо для меня.

Вот код:

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;
  }
}
...