Перетаскивание Wpf Thumb Drag не запускает перетаскивание ввода на другой компонент - PullRequest
2 голосов
/ 12 октября 2011

У меня есть приложение wpf с некоторыми элементами управления Thumb, которые перемещают элементы вокруг холста.Я хочу определить, когда эти большие пальцы перетаскиваются на другой элемент.Тем не менее, перетаскивание ввода на элемент, который перетаскивается, не срабатывает.Я знаю, что этот код работает как элементы перетаскивания, которые не являются большими пальцами, запускают событие.

Является ли событие перетаскивания на большом пальце не событием перетаскивания, которое слушают другие компоненты?

Есть идеи, как получитьэто работать?

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Чтобы выполнить симуляцию события ввода при перетаскивании, когда большой палец перемещается над другим компонентом, я должен был сделать это:

Зарегистрировать обработчик события для дельты перетаскивания большого пальца

EventManager.RegisterClassHandler(typeof(Thumb), Thumb.DragDeltaEvent, new RoutedEventHandler(Thumb_DragDeltaEvent), true);

Затем в обработчике событий посмотрите, находится ли перетаскиваемый элемент над элементом, который слушает движущийся компонент

void Thumb_DragDeltaEvent(object sender, RoutedEventArgs e)
    {
        UIElement src = e.Source as UIElement ;
        if (src != null)
        {                
            Point srcPositionTopLeft = new Point(Canvas.GetLeft(src), Canvas.GetTop(src));
            Point srcPositionBottomRight = new Point(srcPositionTopLeft.X + src.ActualWidth, srcPositionTopLeft.Y + ActualHeight);
            Rect srcRect = new Rect(srcPositionTopLeft, srcPositionBottomRight);
            Rect transformedSrcRect = src.TransformToAncestor(this.Parent).TransformBounds(srcRect);

            Point trgPositionTopLeft = new Point(Canvas.GetLeft(this), Canvas.GetTop(this));
            Point trgPositionBottomRight = new Point(trgPositionTopLeft.X + this.ActualWidth, trgPositionTopLeft.Y + this.ActualHeight);
            Rect trgRect = new Rect(srcPositionTopLeft, srcPositionBottomRight);
            Rect transformedTrgRect = this.TransformToAncestor(this.Parent).TransformBounds(trgRect);

            if (transformedSrcRect.Contains(transformedTrgRect) ||
                transformedSrcRect.IntersectsWith(transformedTrgRect))
            {
                //drag is over element
            }
        }
    }

Не забудьте позже удалить обработчики событий и т.в будущем.

1 голос
/ 12 октября 2011

Видимо нет.Единственными событиями, связанными с Thumb, являются DragStarted, DragCompleted и DragDelta.Другие события для Drag and drop, как и ваше событие DragEnter.Эти события специально предназначены для перетаскивания, как перетаскивание файла из проводника в ваше приложение, которое не имеет ничего общего с большим пальцем.Имена похожи, но на самом деле очень разные.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...