2016-11-30 52 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