RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 608268
Accepted
rdorn
rdorn
Asked:2020-12-27 07:28:22 +0000 UTC2020-12-27 07:28:22 +0000 UTC 2020-12-27 07:28:22 +0000 UTC

如何处理 Microsoft 的 Drag'N'Drop

  • 772

在寻找这个问题的解决方案的过程中,一个新的问题出现了。

在 .NET 中使用 Drag'n'Drop 的 WinForms 控件有几个典型的事件和DoDragDrop方法。

但是有几个问题与它们相关。如果我们DoDragDrop在事件上激活MouseDown,那么在拖动过程完成之前,我们程序的窗口不会接收鼠标事件,但会接收与拖动过程相关的事件。到目前为止,一切似乎都是合乎逻辑的,但是如果在激活对象的拖动后鼠标没有移动,那么该过程不会立即结束,而是无限期超时,此时鼠标事件不会传输到我们的窗口,它实际上导致了上面链接中问题中描述的问题。

对于TreeView并且ListView事实证明有一个开箱即用的解决方案 - 一个事件ItemDrag,但对于可能成为拖放源的其他控件,没有提供这样的解决方案。

到目前为止,只有一种解决方案浮现在脑海:

  1. 在一个事件中MouseDown,提出一个关于可能开始拖放的标志,并记住私有表单字段中的潜在拖动对象。

  2. 通过事件MouseMove,检查鼠标按钮的标志和状态,如果满足指定条件,则调用DoDragDrop参数中的方法,将之前保存的对象作为数据传递给拖动。然后重置标志。

但出于某种原因,在我看来这是一个拐杖,因为根据我们要拖放的内容和位置,代码会有所不同,并且必须为需要此类功能的每个表单复制代码。

实际上问题是,我是否正确理解拖放过程是在操作系统的上下文中执行的,而不是在单个程序中执行的,以确保可以在程序之间拖动对象?如果假设是正确的,那么是否有一种解决方案可以更灵活地解决这些问题,而无需用拐杖制造自行车?如果我的假设不正确,那么在答案中我想看看它是如何工作的。

这个问题是针对 WinAPI 鉴赏家的,但我想在 C# 的上下文中得到一个解决方案。原则上,对我来说,任何适用于 .NET 的解决方案都可以,只要它比已经说明的解决方案更好。

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Andrew_STOP_RU_AGRESSION_IN_UA
    2020-03-10T18:39:00Z2020-03-10T18:39:00Z

    我会合乎逻辑地争论:你没有太多的控件可以接受拖动的对象。我敢肯定他们在1-3的实力形式上。

    那么为什么不看看它是如何ItemDrag在TreeView和中实现的ListView(幸运的是,可以很容易地在 google 上搜索“treeview 源代码”)并通过继承和后续扩展功能在必要的控件中实现您需要的 ItemDrag 事件?

    • 代码很可能几乎相同。(我的意思是ItemDrag原始类的所有继承人的代码)
    • 您的程序代码将不会充斥着不必要的标志和方法。所有内容仍然可读,就好像这些方法开箱即用 :)
    • 1
  2. Peter Lavreniuk
    2020-03-10T18:55:26Z2020-03-10T18:55:26Z

    我会将需要使用 Drag'n'Drop 的控件包装在以下包装器中:

    • 描述对象所在的字段。对于这个对象,如果它被另一个替换,则执行刷新。
    • 描述 GetInnerType() 方法 - 定义控件可以包含的对象的类型。
    • 好吧,使用 MouseDown 和 MouseUp 外壳来描述控件,并检查 IsDragging 字段和 DragContainer - 当前对象所在的位置。
    • 其实在MouseUp上,判断对象相对于DragContainer的类型,和接受这个对象的对象的GetInnerType比较,好吧,接受还是不接受自己内部的对象。

    一边这样想。包裹控制..

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5