【问题标题】:Wpf Thumb Drag not firing drag enter on other componentWpf Thumb Drag没有在其他组件上触发拖动输入
【发布时间】:2011-10-12 15:11:41
【问题描述】:

我有一个带有一些 Thumb 控件的 wpf 应用程序,这些控件可以在画布上移动项目。我想检测这些拇指何时被拖到另一个元素上。但是,不会触发被拖动元素上的拖动输入。我知道这段代码作为非拇指拖动项目触发事件。

拇指上的拖动事件不是其他组件监听的拖动事件吗?

知道如何让它工作吗?

【问题讨论】:

  • 您是否将要放置到的控件的 AllowDrop 设置为 true?
  • @DOTNETBEE 拇指不会启动拖放操作,它或多或少只是鼠标捕获的方便包装。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    希望这对将来的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2019-08-16
      • 1970-01-01
      • 2022-10-24
      相关资源
      最近更新 更多