Перетаскивание без окна в WPF - как это сделать эффективно? - PullRequest
2 голосов
/ 30 апреля 2011

Это код, который я должен перетащить в мое окно.Это вроде работает!Вид ...

Private Point startPoint;

private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{

    startPoint = e.GetPosition(null);
}
private void Window_MouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        Point relative = e.GetPosition(null);
        Point AbsolutePos = new Point(relative.X + this.Left, relative.Y + this.Top);
        this.Top = AbsolutePos.Y - startPoint.Y;
        this.Left = AbsolutePos.X - startPoint.X;
    }
}

Проблема в том, что если я слишком быстро переместлю мышь, она выйдет из окна и перестанет вызывать событие movemouse.Во-вторых, окно перетаскивания не совсем гладкое, что заставляет меня поверить, что я делаю это неправильно.В-третьих, я попробовал это на Window_MouseLeftButtonDown, который вызывал событие только один раз за клик мыши.Я новичок, и я, и многие другие новички, как и я, оценили бы простой пример без Dropping и Data Transfer.заранее спасибо пользователям Stack OverFlow, готовым помочь.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2011

Решение на самом деле проще, чем вы думаете.Поместите эту строку

MouseDown += delegate { DragMove(); };

в свой конструктор, и вы готовы идти :)) 1004 *

0 голосов
/ 30 апреля 2011

Потеря мыши является результатом невозможности захвата мыши. Стандартная процедура:

  • захват мыши в случае нажатия мыши и запись положения мыши
  • обрабатывать движение мыши в событии перемещения мыши, если кнопка нажата
  • отпустить захват мыши в событии mouse up и выполнить окончательную обработку

Что касается производительности, вы идете по этому пути в правильном направлении. Скорость ограничена перерисовкой самого окна и всех окон, через которые проходит окно, и тем, насколько быстрым является ваш компьютер и что еще происходит на компьютере, пока вы его перетаскиваете.

...