我想在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得到答案,因为它最终是正确的,并且还展示了如何使控件的一部分无效......我不知道这一点。
感谢您的帮助!
答案 0 :(得分:4)
调用this.Invalidate()
以使表单/控件重绘自己。如果您知道特定区域,则调用其中一个重载方法以指定要使其无效的内容。例如:
Rectangle toInvalidate = new Rectangle(drgargs.X - 50, drgargs.Y - 50, 50, 50);
this.Invalidate(toInvalidate);
这会使拖动目标区域周围50个像素的区域无效。
答案 1 :(得分:2)
这里有三种看似合适的方法:
Control.Invalidate() - 将控件(区域或矩形)标记为需要重新绘制,但是 不强制重新绘制,重绘是在其他一切都有的时候触发的 被照顾,应用程序变得闲置。
Control.Update() - 使控件立即重新绘制,如果有任何部分 无效。
Control.Refresh() - 使控件无效,然后更新(立即 重绘自己)。
因此,Refresh()是正确的方法。我要做的是在刷新方法调用上设置一个断点,看看是否/何时被击中。