2012-03-21 21 views
7

我讀到0123'事件應該在窗口句柄創建後觸發,但之前窗口實際上變爲可見。大多數情況下,這似乎是對的。但是,我發現當我創建一個屬性設置爲FormWindowState.Maximized(通過VS設計器或編程方式在構造函數中)的窗體時,該窗口在Load事件觸發之前變得可見。例如:將WindowState設置爲Maximized原因窗口顯得過早

using System; 
using System.Windows.Forms; 

namespace MyApplication 
{ 
    public partial class MyForm : Form 
    { 
     public MyForm() 
     { 
      InitializeComponent(); 
      WindowState = FormWindowState.Maximized; 
     } 

     protected override void OnLoad(EventArgs e) 
     { 
      MessageBox.Show("OnLoad - notice that the window is already visible"); 
      base.OnLoad(e); 
     } 
    } 
} 

這又使得所顯示的形式閃爍很多,而其控制(這是本Form.Load事件期間佈置)被調整,而該窗口是可見的。如果我沒有將狀態設置爲最大化,那麼在顯示窗口之前完成所有調整大小(這是我所期望的)。

我可以延遲設置WindowState,直到Load事件結束,但仍會導致大量閃爍,因爲窗口變得可見,然後所有控件都調整大小。

有什麼想法?

+3

那'在負載情況下MessageBox.Show'將迫使形式展現。 – LarsTech 2012-03-21 14:34:25

+1

調整'Load'事件中的控件大小有點可疑。爲什麼不依賴內置控件的調整大小機制,比如'Dock'或'Anchor'屬性或'TableLayoutPanel'?當我稍後手動調整窗口大小時,是否會手動調整控件的大小? – 2012-03-21 14:39:44

+0

我也收到了這個。我在用戶會話之間保存了WindowState,以便表單可以調整大小等等,以便用戶以前擁有它,以及當我將WindowState設置爲最大化時,我會得到很多閃爍等。是否有解決方案來解決此問題? – 2017-11-27 18:52:34

回答

0

改變窗口外觀(例如調整大小)的事情導致窗口變得可見。

你可以稱之爲.Hide().Visible = False在您的構造函數,並使其在.Load結束時再次可見

+0

可見設置爲false似乎沒有任何效果。這可能與這樣一個事實有關,即窗體是應用程序的主要形式,並通過Application.run – user1283610 2012-03-21 14:43:41

1

如果你需要把一些診斷消息在Load事件使用System.Diagnostics.Debug.WriteLine() ;
如果使用MessageBox,則會銷燬正常的事件流順序。

protected override void OnLoad(EventArgs e)   
{    
    System.Diagnostics.Debug.WriteLine("onLoad");    
    base.OnLoad(e);   
} 

This post解釋更多的細節

2

儘量拖延的WindowState,直到第一次激活事件觸發的變化。這適用於VS.NET中的VS2005和框架2.0。

+0

進行顯示。當windowstate從最大化狀態變爲正常時,這對我有用。相反,我將它設置爲在Load事件窗口中最大化。 – NielW 2014-05-09 16:37:27

1

你必須設置的WindowState BEFORE的InitializeComponent():

public Form() //Constructor 
    { 
     WindowState = FormWindowState.Maximized; 

     InitializeComponent(); 
    } 
相關問題