2016-06-13 64 views
1

我正在創建系統托盤應用程序。在初始化應用程序,我想:Windows窗體:啓動時,加載但隱藏表格

  • 初始化,所以它在後臺
  • 運行加載一個形式,而是保持隱蔽的形式(直到用戶doubleclicks托盤圖標)

它非常重要,因爲表單包含一個嵌入式瀏覽器,它將初始化Web套接字連接以接收數據,因此表單將在後臺加載並運行。但它需要隱藏。我試圖通過使用表格的Visible屬性來解決這個問題。到目前爲止,我有這個(僅顯示相關的代碼):

public TrayApp() 
{ 
    var ni = new NotifyIcon();  
    InitializeForm(); 
    ni.DoubleClick += this.ShowForm; 
} 

private void InitializeForm() 
{ 
    //load the form in the background so it can start receiving incoming data, but don't actually show the form 
    myForm = new MyForm(); 
    myForm.Show(); 
    myForm.Visible = false; 
} 

private void ShowForm(object sender, EventArgs e) 
{ 
    myForm.Visible = true; 
} 

這工作得很好,除了一個小細節:在啓動應用程序,我簡要地看到形式閃爍之前,它是隱藏的。我想Show方法還將Visible標誌設置爲true,導致閃光發生。

其他的事情我試過,基於評論:

  • 不要叫myForm.Show(),只有初始化的形式。這避免了閃光燈,但不會加載瀏覽器,因此WebSocket連接尚未初始化
  • myForm.Hide():如以前
  • Opacity效果相同0調用Show()之前和設置Visiblefalse後,將其設置爲1:這實際上工作,但我希望有一個更清潔的解決方案

如何避免閃光,並保持窗體運行,但隱藏?

+1

如果您調用'Show'或'ShowDialog',則已經太遲而無法隱藏。你不能避免調用這些方法嗎?在模型中使用抽象:創建在後臺運行的模型,然後可以隨時創建視圖(甚至是多視圖)並將其附加到模型以查看累積或拍攝狀態。在MVVM之後,將套接字通信放在Form中感覺非常不對。 – Sinatr

+0

try myform.Hide(); –

+0

在你的初始化表單中,只是不做「隱藏它」後面的「顯示」,它已經存在,一旦你完成了新的MyForm()..除非你有一些觸發代碼int show - 你可以運行..不顯示錶單當然 – BugFinder

回答

0

您可以嘗試在顯示錶單之前設置隱藏屬性。

myForm = new MyForm(); 
myForm.Visible = false; 
myForm.Show(); 
+0

謝謝,但這只是顯示窗體(大概是因爲Show()方法也將Visible標誌設置爲true) – fikkatra

+2

它不是那樣工作的。顯示/隱藏基本上可見=真,可見=假。 – BugFinder

0

你可以嘗試編寫一個初始化套接字的函數。把這個函數放在你的MyForm類中,並從InitializeForm()中調用它。

希望這會有所幫助。

+0

套接字是從瀏覽器中運行的網站(由表單託管)初始化的。無需在表單應用程序內創建套接字連接。我似乎通過提到'套接字'這個詞來困惑每個人,但我只是想強調錶單中的瀏覽器實際上正在運行(例如表單被加載)這一點很重要。 – fikkatra