在拖放期间重绘

时间:2009-07-22 22:27:26

标签: c# .net drag-and-drop

我想在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得到答案,因为它最终是正确的,并且还展示了如何使控件的一部分无效......我不知道这一点。

感谢您的帮助!

2 个答案:

答案 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()是正确的方法。我要做的是在刷新方法调用上设置一个断点,看看是否/何时被击中。