Я занят небольшим приложением, в котором хочу отображать информацию в месте расположения курсора, когда он поднимается над Canvas. Предложенный Canvas является обычным (унаследованным от Canvas), который предоставляет функциональность для добавления DrawingVisuals (как показано в основном в каждом учебном пособии по отображению большого количества геометрических фигур на холсте).Проблема с производительностью DrawingVisual после курсора при использовании события onMouseMove
Я хотел бы показать вертикальную линию и горизонтальную линию, а также локальные координаты (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, кажется, создает много накладных расходов, и я могу видеть, что есть проблемы отслеживания движения мыши при перемещении мыши быстро.
Может ли кто-нибудь рекомендовать лучший способ создания такого же эффекта?
example http://www.iccg.be/test/images/canvas.jpg
Edit: я исследовал его немного дальше, и проблема, кажется, происходит, когда разрешение холста больше. Если это холст 600x400, то нет задержек, но когда он составляет около 1000x800, я получаю проблему с задержками при обжиге. Производительность также улучшается, если я использую привлеченные пользователем перекрестия вместо линий, которые имеют полную ширину/высоту холста.
Как он ведет себя, когда вы установите [Transform] (http://msdn.microsoft.com/en-us/library/system.windows.media.containervisual. transform.aspx) в [TranslateTransform] (http://msdn.microsoft.com/en-us/library/system.windows.media.translatetransform.aspx) вместо использования Offset? – Clemens
Спасибо за ваш быстрый ответ, но, к сожалению, нет улучшения с 'TranslateTransform' – Geoffrey