Wpf 失控

Wpf 失控,wpf,drag-and-drop,tabcontrol,Wpf,Drag And Drop,Tabcontrol,我正在改进standart WPF TabControl。我想向其添加取消停靠功能: 用户将页面拖动到TabControl的正外部,该页面在窗口中解锁。 我希望此控件中有两个事件—PageDragStart(页面拖到外部时引发)和PageDragEnd(页面拖到外部时引发) 我对第一件事没有异议 但是第二个。。。OnDrop不调用,因为该项已丢弃在TabControl容器之外。我怎么知道它掉了 另外,我想要一个通用控件(因此,不应将解锁功能与窗口选项卡连接并硬编码控件被放置或类似的内容)我以一种

我正在改进standart WPF TabControl。我想向其添加取消停靠功能: 用户将页面拖动到TabControl的正外部,该页面在窗口中解锁。 我希望此控件中有两个事件—PageDragStart(页面拖到外部时引发)和PageDragEnd(页面拖到外部时引发)

我对第一件事没有异议

但是第二个。。。OnDrop不调用,因为该项已丢弃在TabControl容器之外。我怎么知道它掉了


另外,我想要一个通用控件(因此,不应将解锁功能与窗口选项卡连接并硬编码控件被放置或类似的内容)

我以一种相当残酷和不安全的方式解决了这个问题。但这只是暂时的解决办法

嗯,当我引发PageDragStart事件时,我调用Mouse.Capture(这是CaptureMode.SubTree); 当页面被放在某个地方时,DoDragDrop会抛出不同的异常(COMException、NullReference(我找不到哪个对象为null)和其他一些我不记得的异常)。 我捕获异常并调用PageDragGend事件(如果属性IsPageDragingOut设置为true)

就你所见,这个解决方案是非常肮脏和糟糕的。但它是有效的


那么,还有其他想法吗(或者一些如何正确使用鼠标的想法)?

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

  • 在选项卡上处理OnMouseLeftButtonDown并开始捕获
  • 在选项卡上处理OnMouseMove并根据点击测试更新光标
  • 处理选项卡上的OnMouseLeftButtonUp,停止捕获并进行适当的更改
  • <> P>你可能会考虑DORAGRODROP的简单鼠标捕获的原因是:

  • 与Windows的OLE拖放集成,因此您可以在应用程序和技术之间进行拖放
  • DoDragDrop调用的模态特性(这实际上似乎对我更不利)
  • 目标的自动命中测试
  • 标准化的“删除操作”API,允许无关的应用程序处理复制与移动等操作

  • 显然,您不需要OLE集成或多应用程序支持,并且希望自定义命中测试,因此DoDragDrop似乎没有直接处理鼠标捕获的优势。

    mmm。。。由于某种原因,我无法添加答案。问题:您是否在尝试拖动到的控件上设置了AllowDrop?在windows窗体中,我使用了这个技巧。OnMouseUp甚至在TabControl之外呼叫。不幸的是,在WPF中,这个技巧不起作用。我的控件将是一个黑匣子——它不知道其他控件。但当然,当我在应用程序中使用它时,所有周围的控件都将AllowDrop设置为true。问题是OnDrop(或OnMouseUp)在目标控件中调用,而不是在源控件中调用。但是我希望它在源代码中被调用(理想情况下是在双方),是的,他们的方法非常不同。我不是WPF拖放方面的专家,但在我所做的工作中,我必须在我想要拖动到的每个控件上设置AllowDrop,以便对其进行识别。AllowDrop已设置,并且drop事件在我拖动页面的控件上引发-但这不合适。如果我开始订阅所有控件的Drop事件并检查页面是否被删除,然后我将其取消锁定,那么这就太硬了,而且不通用了。。。那太可怕了。。。