2016-11-30 138 views
0

是否有与面事件等效的面板事件显示? 我在一个永远不会关闭的窗体中进行了几次面板切换。 但是我找不到任何接近Shown这样的事件的东西。 我关闭的是Paint事件。不过,我只希望每次显示时更新面板一次。C#Winform面板显示的事件

+0

Form.Shown在第一次显示表单时提出。它再也不会升起。因此,对于任意控制,您可以使用类似HandleCreated的东西,重写OnCreateControl()方法来添加代码。但是,这听起来像你认为Form.Shown的作用有点不同,它实际上... –

+0

你如何显示面板?提供一些代码将有所帮助。 – djv

+0

焦点事件有什么问题?它显示焦点不集中吗? – user1274820

回答

0

您可以在VisibleChanged事件上收听,并仅在可见性=真时进行操作。

https://msdn.microsoft.com/en-us/library/system.windows.forms.panel_events%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

您也可以与EnterInvalidated事件的实验,看看这些给你你想要的结果。

或者,如果在离开时禁用面板是一个选项,您可能可以在工具箱中使用EnabledChanged事件。

+0

在我的情况下,可见性总是如此。我有一个主面板作为子面板的容器,在运行时,主面板控制清晰,子面板添加进来。子面板在卸载时不会被破坏。 – ishtarsg

0

Form.Shown不会在每次显示表单时提出,而应该是Occurs whenever the form is first displayed。这就是说,没有事件发生,并且没有事件在“首次显示面板时”引发。

您可以使用Panel.Paint事件来模拟此行为,使用标记来跟踪它之前是否“显示”过一次。这将使其行为类似于Form.Shown

private bool panel1Painted = false; 
private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    if (!panel1Painted) 
    { 
     // do your shown stuff here 
     panel1Painted = true; 
    } 
} 

为了保持在Form.Shown精神,你可能想如果面板重建复位标志。这与显示的不一样。

+0

由于面板本身没有被破坏,并且可能存在同一面板的另一个实例,因此更改面板1可能不会随后反映在同一实例的面板2中。 – ishtarsg

+0

为每个面板使用不同的标志。我认为这很明显。 – djv

+0

@CodyGray“Paint事件被触发了一个*很多*”是一个不真实的语句(好吧,这取决于您的* lot *的定义,我猜。每次显示面板时,是一个* lot *?) 。也许你可以测试它并报告你的发现。另外'if(!panel1Painted)'在评估Panel显示时并不是非常昂贵。也许你也可以测试一下吗? – djv