在拖放期间重绘

Posted

技术标签:

【中文标题】在拖放期间重绘【英文标题】:Redrawing during drag and drop 【发布时间】:2010-11-13 05:01:58 【问题描述】:

我想在 DragEnter 和 DragLeave 事件期间触发拖动目标控件以重绘自身(通过无效或刷新)。代码如下所示:

protected override void OnDragEnter (DragEventArgs drgargs)

  //-- Set a property that affects drawing of control, then redraw
  this.MyProperty = true;
  this.Refresh(); //-- Does nothing???      


protected override void OnDragLeave (EventArgs e)

  //-- Set a property that affects drawing of control, then redraw
  this.MyProperty = false;
  this.Refresh(); //-- Does nothing???      

它实际上并没有重绘控件,这些事件中的 Refresh() 不会调用 OnPaint 方法。有没有办法做到这一点?我一定不明白这里的一些东西。

更新: jasonh 提供的答案实际上不起作用。使用 Invalidate() 或 Invalidate(rect) 时,控件实际上不会更新。这是在拖放操作期间调用。还有其他想法吗?您可以在拖放期间触发控件的重绘吗?谢谢!

更新 2:我创建了一个示例项目,但无法使其工作。叹息......我终于找到了导致问题的 OnPaint 中的一些代码。所以,结果证明我更多的是不理解调试器是如何工作的(它从来没有在 OnPaint 中遇到断点......仍然不知道为什么)。 Invalidate()、Refresh() 都有效。 JasonH 得到了答案,因为它最终是正确的,并且还展示了如何使控件的一部分无效……我不知道。

感谢您的帮助!

【问题讨论】:

我的猜测是您没有将 AllowDrop 设置为 true。 是的,AllowDrop 设置为 true。拖放正在发生。只是控件的重绘不是(在 Invalidate() 或 Refresh() 之后不调用 OnPaint)。 【参考方案1】:

调用this.Invalidate() 让表单/控件重绘自身。如果您知道特定区域,则调用其中一种重载方法来指定要使哪些内容无效。例如:

Rectangle toInvalidate = new Rectangle(drgargs.X - 50, drgargs.Y - 50, 50, 50);
this.Invalidate(toInvalidate);

这将使拖动目标所在区域周围 50 像素的区域无效。

【讨论】:

这不起作用。问题是关于在拖放事件期间执行此操作的。如果它对你有用,那一定是我做错了什么...... 不知道为什么我被否决了,因为 Invalidate 完全符合它的预期。 确保 UserControl 的 AllowDrop 属性设置为 true。我已经在一个简单的项目中对此进行了测试,其中一个字符串被绘制到控件上,它确实会根据用户是否拖动到控件上来改变颜色(我正在测试的内容)。您能否发布一个不起作用的项目示例,以便我可以帮助您修复它? 为什么会被否决? Invalidate 是强制重绘控件的正确方法。 如果它对您不起作用,那么它是 your 代码中的问题,而不是本示例。【参考方案2】:

这里有三种看似适用的方法:

Control.Invalidate() - 将控件(区域或矩形)标记为需要重新绘制,但是 不强制重绘,当其他所有内容都有时触发重绘 得到照顾,应用程序变得空闲。

Control.Update() - 如果有任何部分已被删除,则使控件立即重新绘制 无效。

Control.Refresh() - 使控件无效,然后更新(立即 重绘自身)。

因此,Refresh() 是正确的方法。我要做的是在刷新方法调用上设置一个断点,看看它是否/何时被命中。

【讨论】:

它被击中了。它会执行,但实际上不会导致调用 OnPaint。

以上是关于在拖放期间重绘的主要内容,如果未能解决你的问题,请参考以下文章

使控件在拖放期间对拖动事件透明

在拖放期间在 NSTableView 中打开一个间隙

Chrome F8/热键调试器在拖放操作期间中断

UITableView - 如何在拖放期间更改单元格的背景颜色?

如何在 OSX 上拖放期间检测 META 按键

拖放完成或取消时在拖放源中触发的事件