落在控制之外

时间:2010-01-04 23:37:28

标签: wpf drag-and-drop tabcontrol

我正在改进标准WPF TabControl。我想为它添加取消停靠功能: 用户在TabControl外部拖动页面,此页面在窗口中取消停靠。 我想在这个控件中有两个事件 - PageDragStart(当页面拖到外面时引发)和PageDragEnd(当页面掉到外面时引发)

第一次活动我没有问题。

但是第二个...... OnDrop没有调用,因为该项目在tabcontol容器之外掉线。我怎么知道它被丢弃了?

P.S。我想要一个通用控件(因此,不应该连接取消停靠功能并使用窗口tabcontrol进行硬编码或类似的东西)

2 个答案:

答案 0 :(得分:1)

为什么要使用DoDragDrop?当我阅读您的描述时,单独使用Mouse.Capture似乎是一个明显的解决方案:

  1. 在选项卡上处理OnMouseLeftButtonDown并开始捕获
  2. 在选项卡上处理OnMouseMove并根据命中测试更新光标
  3. 在选项卡上处理OnMouseLeftButtonUp,并停止捕获并进行适当的更改
  4. 您可能认为DoDragDrop超过简单鼠标捕获的原因是:

    1. 与Windows的OLE集成拖放,以便您可以在应用程序和技术之间拖放
    2. DoDragDrop调用的模态性质(实际上对我来说似乎更不利)
    3. 目标的自动命中测试
    4. 标准化的“放弃操作”API,允许不相关的应用程序处理复制与移动等
    5. 您显然不需要OLE集成或多应用程序支持,并且您希望自定义命中测试,因此DoDragDrop似乎没有直接处理鼠标捕获的优势。

答案 1 :(得分:0)

我以相当野蛮和不安全的方式解决了这个问题。但是因为它可以作为临时解决方案。

好吧,当我提出PageDragStart事件时,我调用了Mouse.Capture(this,CaptureMode.SubTree); 当页面被丢弃时 - DoDragDrop抛出不同的异常(COMException,NullReference(我找不到哪个对象为null)和其他一些我不记得的异常)。 我捕获异常并调用PageDragEnd事件(如果属性IsPageDraggingOut设置为true)。

据你所知,这个解决方案真的很脏而且很糟糕。但它确实有效。

那么,任何其他想法(或一些想法如何正确使用Mouse.Capture)?