在拖放期间重绘
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 像素的区域无效。
【讨论】:
这不起作用。问题是关于在拖放事件期间执行此操作的。如果它对你有用,那一定是我做错了什么...这里有三种看似适用的方法:
Control.Invalidate() - 将控件(区域或矩形)标记为需要重新绘制,但是 不强制重绘,当其他所有内容都有时触发重绘 得到照顾,应用程序变得空闲。
Control.Update() - 如果有任何部分已被删除,则使控件立即重新绘制 无效。
Control.Refresh() - 使控件无效,然后更新(立即 重绘自身)。
因此,Refresh() 是正确的方法。我要做的是在刷新方法调用上设置一个断点,看看它是否/何时被命中。
【讨论】:
它被击中了。它会执行,但实际上不会导致调用 OnPaint。以上是关于在拖放期间重绘的主要内容,如果未能解决你的问题,请参考以下文章