Wpf Thumb拖动不触发其他组件上的拖动输入

时间:2011-10-12 15:11:41

标签: c# wpf drag-and-drop wpf-controls

我有一个带有一些Thumb控件的wpf应用程序,可以在canvs周围移动项目。我想检测这些拇指被拖过另一个元素的时间。但是,不会触发拖动的元素上的拖动输入。我知道这段代码可以作为拖拽物品,不会引发事件。

拇指上的拖动事件是否是其他组件侦听的拖动事件?

知道如何让它发挥作用吗?

2 个答案:

答案 0 :(得分:1)

显然没有。唯一与Thumb相关的事件是DragStarted,DragCompleted和DragDelta。其他事件用于拖放,就像您的DragEnter事件一样。这些事件特别适用于拖放,例如将文件从资源管理器拖到与Thumb无关的应用程序中。这些名字很相似,但实际上非常不同。

您可以尝试的一件事是在拖动时使用HitTesting,但请记住拖放和拖动鼠标会捕获鼠标,这会禁用其他类上的输入事件。

答案 1 :(得分:1)

要在拇指对象移动到另一个组件上时实现拖动输入事件的模拟,我必须这样做:

注册拇指拖动增量的事件处理程序

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

请记得稍后删除事件处理程序等。

希望这有助于将来。