2012-08-03 79 views
1

我正在編寫一個應用程序,其中主窗體必須隱藏起來,但它在啓動時顯示對話框。窗體加載不會觸發已隱藏的窗體?

我的主窗體在由構造函數調用的initialize()方法中有以下行。

this.Load += new System.EventHandler(this.MainForm_Load); 

我已經驗證它上面的代碼打但MainForm_Load()方法不會被調用。

難道這是因爲我隱藏了表單嗎?

我執行Program.cs中的主要以下行:

Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 

而且已經覆蓋在表格下面的方法:

protected override void SetVisibleCore(bool value) 
{ 
    _logger.Debug("Hiding the main window"); 
    base.SetVisibleCore(allowShowDisplay ? value : allowShowDisplay); 
} 

凡allowShowDisplay設置爲false;

我在this queston的答案中找到了此解決方案的至少一部分,並已將其用於另一個項目。該項目雖然沒有使用表單加載事件。我正在做的那個。

UPDATE 這就是Main方法的樣子。我正試圖將依賴注入到所有元素中。我已更改名稱以刪除客戶名稱。

[STAThread] 靜態無效的主要(){

 ServiceHost incomingPipeHost = new ServiceHost(typeof(ScreenPopService)); 
     incomingPipeHost.Open(); 

     XmlConfigurator.Configure(); 
     _logger.Debug("Starting Application"); 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     _logger.Debug("Creating subformView"); 
     ISubformView subformView = new SubformView(); 

     _logger.Debug("Creating MainForm mainForm"); 
     MainForm mainForm = new MainForm(); 

     _logger.Debug("Creating MonitorController"); 
     IMonitorController MonitorController = new MonitorController(); 

     _logger.Debug("Adding View to MonitorController"); 
     MonitorController.View = mainForm; 

     _logger.Debug("Adding subFormView to mainForm"); 
     mainForm.SubFormView = subFormView; 

     _logger.Debug("Adding MonitorController to mainForm"); 
     mainForm.MonitorController = MonitorController; 

     _logger.Debug("Loading Properties"); 
     IProperties properties = PropertiesManager.LoadProperties(); 

     _logger.DebugFormat("Loaded Properties [{0}]", properties); 
     _logger.Debug("Setting properties on mainForm"); 
     mainForm.Properties = properties; 

     _logger.Debug("Setting properties on MonitorController"); 
     MonitorController.Properties = properties; 

     _logger.Debug("Settting ScreenPop Consumer on MonitorCotroller"); 
     MonitorController.screenPopConsumer = ScreenPopCallBackManager.Instance; 

     _logger.Debug("Debug Running Application"); 

     Application.Run(mainForm); 
    } 
+0

你是否正在創建一個新形式的實例..?如果是這樣,顯示適用於問題/問題的代碼。 – MethodMan 2012-08-03 14:50:30

+0

我正在創建一個窗體的實例,向其中添加一堆參數,然後使用窗體作爲參數調用Application.Run。該表單還有一個與之關聯的通知圖標,正在顯示。 – 2012-08-03 14:53:57

+0

我發佈的示例我有工作,但不知道它是否是你正在尋找的..注意我是如何創建一個形式的實例..你可以做同樣的重寫/設置值的方式以及.. – MethodMan 2012-08-03 14:59:20

回答

0

我張貼這是我怎麼會不使用MDI現在在我的Program.cs的文件,這是我的代碼看起來像..

靜態類節目

{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     try 
     { 
      Application.Run(new MainForm()); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message + "\n\n\n" + ex.GetType().ToString(), "Error in MainForm"); 

     } 
    } 
} 

現在,我要隱藏,然後將展現在我的MainForm下面的代碼形式的代碼這將是我正在做的一個例子,如果一個表單加載並且我使用菜單點擊事件。但MDI是你想要看的。改變例子以適合你的用例。

private void newStudentRecordToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      StudentForm studForm = new StudentForm(); 
      studForm.MdiParent = this; 
      studForm.Show(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message + "\n\n\n" + ex.GetType().ToString(), "Error in Student Form"); 
     } 
    } 
+0

當然,它應該沒有問題,我如何初始化主窗體(通過它的自我或在Application.Run()方法中的一行)我仍然調用Application.Run() – 2012-08-03 15:05:05

+0

Omar ..看看我的MDI示例調用Application.Run與單一的表單我會同意你的發言..但使用多個表單你的假設是有點關閉.. – MethodMan 2012-08-03 15:11:58

+0

我不打開我的子表單使用MDI我打開他們使用ShowDialog因爲我更關心我認爲你可能試圖解決與我所看到的不同的問題 – 2012-08-03 15:42:37

0

我可以建議重新檢查MainForm_Load的方法簽名。簽名應該像「MainForm_Load(對象發件人,發送System.EventArgs)」

這可能聽起來有點扯,但我有過這樣的問題,浪費了一些時間:)

讓我知道,如果這有助於。謝謝!

+0

mainform_load方法是由IDE添加的,我沒有編輯簽名,我只是再次檢查它並且它是正確的。 – 2012-08-03 15:40:19

3

這是設計。窗體的Visible屬性(以及相關的SetVisibleCore和Show方法)是Winforms中的一件大事。在典型的.NET懶惰時尚中,這就是創建具體窗口的原因。換句話說,Winforms不會創建該窗口,除非它的具有

通過重寫SetVisibleCore()並強制屬性爲false,可以防止發生這種情況。該窗口沒有而是被創建。還有一堆其他的東西不會發生,包括解僱Load事件。調用窗體的Close()方法不會像通常那樣停止程序。

這是所有正常行爲。如果您的Load事件處理程序包含重要的東西,那麼一定要將其移到構造函數中。你只需要Load就知道窗口的大小和位置。

0

我最終爲此付出的解決方案似乎已經工作是將mainForm從調用中移除到Application.Run(),然後在調用Application之前調用mainForm.show(),緊接着調用mainForm.Hide() .Run()

mainForm.Show(); 
mainForm.Hide(); 

Application.Run(); 

似乎工作。