Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当窗体位于下面时,回调期间的OnPaint事件?_C#_.net_Winforms_Onpaint - Fatal编程技术网

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()。不管怎样,这对我来说似乎更为一致