C# 当窗体位于下面时,回调期间的OnPaint事件?
想象一下以下场景:C# 当窗体位于下面时,回调期间的OnPaint事件?,c#,.net,winforms,onpaint,C#,.net,Winforms,Onpaint,想象一下以下场景: this.SetStyle(ControlStyles.UserPaint, true); //this doesn’t change anything … void OpenSomeForm() { SomeForm sf = new SomeForm(); sf.SomeEvent += new … (SomeEventOcurred); sf.ShowDialog(); } private void SomeEventOcurred(…)
this.SetStyle(ControlStyles.UserPaint, true); //this doesn’t change anything
…
void OpenSomeForm()
{
SomeForm sf = new SomeForm();
sf.SomeEvent += new … (SomeEventOcurred);
sf.ShowDialog();
}
private void SomeEventOcurred(…)
{
OnePanelInThisForm.Invalidate();
}
private void OnePanelInThisForm_Paint(object sender, PaintEventArgs e)
{
DoSomeDrawing(e.Graphics);
}
现在,OnePanelInThisForm在加载表单时正确绘制。但是,如果SomeEventOcurred是从“SomeForm”激发的,则绘制事件是而不是激发的。如果我关闭并重新打开表单,它将正确地重新绘制。
如果我向执行的表单添加一个按钮:OnePanelInThisForm.Invalidate();面板重新喷漆正确
我错过了什么
更新:澄清。(我们为什么不先这样做…)
我有一个表单a。此表单a有一个覆盖绘制事件的面板。这是一个标准的WinForm。在绘画中它画了一个圆圈。这很有效。原来表单A有一个打开表单B的按钮,但在执行此操作之前,它订阅了表单B中一个名为SomeEvent的自定义事件。(参见上面的示例)。所以表格B可以告诉表格A关于“某件事”
现在,FORM_B也是一个普通的WinForm。它有一个普通的按钮。在该按钮的Click事件中,它打开FORM_C。FORM_C还有一个名为SomeEvent的事件,显然FORM_B订阅了该事件。跟以前一模一样。这个想法是FORM_C有一个按钮,可以触发该事件,通知感兴趣的订阅者。在这种情况下,当FORM_C触发事件时,FORM_B被订阅并感兴趣
当FORM_B收到回电时,它所做的唯一事情就是……通知相关方(在本例中为FORM A)事件已被触发
现在,即使表单C仍然是顶级表单,调用堆栈也会返回到FormA,返回到定义为从第一个事件回调的方法
此代码执行。它所做的只是somePanel.Invalidate()(或Refresh(),结果相同)
该面板的PAINT方法中的断点显示代码未被调用。尽管无效,但未引发任何绘制事件。我假设发生这种情况是因为表单(因此面板)实际上被FORMB和FORMC覆盖(仍然打开)
就这些。如果我先关闭表格C,然后关闭表格B,表格A仍然不会引发油漆事件。我尝试过在表单激活时使面板无效,但没有发生
如果我关闭表单A并重新打开它,那么图形当然是正确的
希望这能让事情变得更清楚
实际上没有太多的代码,因为这非常简单,表单A>B>C(火灾事件)->B->A->Invalidate()。尝试使用Refresh()而不是Invalidate()。不管怎样,这对我来说似乎更为一致