Как вы реализуете перетаскивание с небольшого хоста элемента WPF в приложении Winforms?

В нашем приложении мы размещаем небольшой список WPF внутри хоста Element, мы реализуем перетаскивание с помощью события PreviewMouseDown...

   private void Border_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            // Get the current mouse position
            Point mousePos = e.GetPosition(null);
            Vector diff = startPoint - mousePos;

            if (e.LeftButton == MouseButtonState.Pressed &&
                Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
                Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
            {
                OnDragStarted(e);                
            } 

        }

Проблема, которую мы наблюдаем, заключается в том, что когда я щелкаю и перетаскиваю элемент довольно быстро, элемент управления WPF запускает только одно событие PreviewMouseMove до того, как мышь покинет Elementhost, поэтому операция перетаскивания не запускается до тех пор, пока мышь не вернется на Elementhost и еще один PreviewMouseMove событие поднято.

Есть ли надежный способ справиться с этим случаем?


person Andronicus    schedule 14.03.2011    source источник


Ответы (1)


Вы должны захватить мышь в событии мыши. Любые движения мыши после этого всегда направляются в ваше окно, даже если курсор больше не зависает над ним. Используйте метод Mouse.Capture() в WPF.

person Hans Passant    schedule 14.03.2011
comment
СПАСИБО! Эта проблема долгое время мешала моему приложению, и теперь она, наконец, исправлена. Я вызываю Child.CaptureMouse() в событии предварительного просмотра с нажатой мышью и Child.ReleaseMouseCapture() в событии предварительного просмотра с нажатой мышью. - person Andy; 11.04.2013