拖放控制 - 邪恶?

Posted

技术标签:

【中文标题】拖放控制 - 邪恶?【英文标题】:Drag n' Drop Controls - Evil? 【发布时间】:2010-10-02 17:32:18 【问题描述】:

我无法忍受像线程和计时器这样的拖放控件。这些控制感觉与它们存在的实际本质相去甚远。拖放线程?我希望 Drag n' Dropper 在他们这样做之前了解幕后发生的事情。

这些抽象是不是离金属太远了?他们是在帮助还是伤害程序员

【问题讨论】:

【参考方案1】:

我不认为他们是邪恶的。在窗体上放置控件只是“new Thread()”或“new Timer()”的另一种说法,许多程序员也并不真正理解。

简单的解决方案并不总能满足您的需求,但当它们满足时,使用它们有什么问题?

但是,如果使用拖放是程序员知道如何做事的唯一方式,那这不是一个很好的程序员。

【讨论】:

System.Windows.Forms.Timer 组件的行为与其他 Timer 类不同。程序员在使用它们之前应该知道它们的区别。见msdn.microsoft.com/en-us/magazine/cc164015.aspx。 @Michael:同意。我认为这就是 Kristopher 的最后一点。如果您使用 S.W.F.Timer 是因为它既方便又符合您的需求,那很好;如果你在它明显不适用的时候使用它,因为它就是你所知道的,然后放下鼠标并阅读一些 MSDN。【参考方案2】:

我认为他们正在伤害程序员。拖放不是编程。

我可能会用大笔画笔,但我发现大多数 Web 应用程序开发人员(特别是 .NET WebForm 开发人员)在涉及 HTTP 模型时完全缺乏知识,这让我感到震惊,比如因为 POST 和 GET 由于它们遇到的抽象而无法掌握。

This article 读起来很有趣,完全反映了我的观点。

【讨论】:

拖放确实不是编程,但在获得工作代码之前不必学习内部原理是可以的。例如,我认为 Visual Studio 设计器对程序员隐藏一些细节的方式是一件好事。无论如何,您最终都必须学习它们。【参考方案3】:

就我个人而言,我没有理由在我的职业生涯中使用多线程编程,尽管我确实在大学学习过。因此,Timer 控件对我特别有帮助因为我不想学习如何在 .NET 中进行多线程编程,只是为了获得一些简单的功能。

【讨论】:

++ 这一定是反对拖放线程的最佳论据。 这里的关键词是简单功能。如果我做的事情比运行快速的“从某个表中选择计数(*)”更复杂,那么我会花时间真正学习它。【参考方案4】:

“Drag 'n Drop”意味着使用 IDE 的 WYSIWYG 部分?

我是在 VB6 和 Dreamweaver 代码中长大的,所以如果是这样的话,我会选择“非常好”

【讨论】:

【参考方案5】:

BackgroundWorker 增加了真正的价值。它生成的代码(通过使用事件模型)比通过使用委托调用手动执行线程,然后通过 Control.Invoke 将结果编组回 UI 线程来生成更简洁的代码。

我在没有测试 Control.IsHandleCreated 的情况下测试 Control.InvokeRequired 已经被烧死了。当代码已经在 UI 线程上执行并且控件不存在时,Control.InvokeRequired 将返回 false。如果我使用 BackgroudWorker,我可能不会遇到这个问题。

【讨论】:

你说得对,BackgroundWorker 使得在表单中生成和重新加入工作线程变得非常容易。然而,程序员将其用作理解线程工作原理的拐杖是危险的。【参考方案6】:

(从问题上的 .Net 标记来看,我假设我们在谈论拖放控件时谈论的是 Visual Studio 设计人员。)

我不认为它们是邪恶的,尽管我同意它并不总是最适合组件(如线程)的隐喻。

对我来说,拖放控件并不是“这是一个远离金属的 UI 组件”的声明。相反,这是一个声明,我“希望设计师为我管理这个组件的生命周期”。从这个角度来看,通过拖放添加诸如后台工作者之类的东西是非常明智的。事实上,这是我最喜欢的将任何 IDisposable 对象包含为(例如)UserControl 或 Form 的成员的方法。这样,代码生成器就为我处理好了,我可以更多地关注我的代码做什么,而不是布线。

【讨论】:

【参考方案7】:

我认为对于基本的长时间运行的操作;或一种情况,后台工作人员控制非常适合这些情况。如果您正在做比这更高级的事情,那么您应该研究线程和多线程设计的高级用途。

因此,要想快速启动并运行线程,这并没有什么坏处;但是将其用作执行线程的唯一方法,那肯定会伤害程序员。

【讨论】:

【参考方案8】:

这是一个 UI 隐喻。

你拖放的东西应该是一个“东西”,一个文件、文档或任何东西到另一个“东西”一个容器、垃圾箱、碎纸机、打印机或其他东西。

将线程/​​任务拖放到计时器会失去基本的隐喻,感觉不对。

右键单击和下拉对于“开始计时器”之类的“动词”要好得多。

【讨论】:

【参考方案9】:

好消息是,由于 .NET,拖放控件不需要使用拖放样式。我个人认为,虽然拖放对于原型设计来说是可以的,但您的要求越复杂,您就越有可能发现设计师的限制和阻碍。一个简单的例子是当您调整包含窗口大小时应该扩展的表单。您很快就会发现自己编写了如此多的代码,以致于完全放弃设计器会更好。

那是在我们讨论设计器中的错误之前,例如,删除所有事件......

【讨论】:

以上是关于拖放控制 - 邪恶?的主要内容,如果未能解决你的问题,请参考以下文章

Swift OSX NSImageView 拖放

DataGridView多行选择清除鼠标左键拖放

NSTableView 并从 Finder 拖放

TableView 拖放功能

QTreeWidget 仅在顶层拖放

nstableview 拖放与自定义单元格视图