2009-04-30 34 views
22

我在載入事件期間將窗體的可見性更改爲false,並且窗體仍然顯示它自己。什麼是正確的事件,以配合this.Visible = false;至?我想實例化Form1而不顯示它。C#/ .net - WinForms - 實例化一個窗體而不顯示它

using System; 
using System.Windows.Forms; 

namespace TestClient 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      this.Visible = false; 
     } 

    } 
} 
+4

我很困惑有多少人在這個線程中給出了答案,但沒有檢查結果。隱藏(); Visible = false;在這種情況下,這些東西都不起作用。它不像其他形式,它的主要形式,無論你做什麼,它都會顯示出來。這裏的人們在給出虛假答案之前需要思考。順便說一下,Visual Studio 2010中的Main Form沒有Visible屬性。它根本就不存在。 – 2011-02-13 17:59:22

+0

@Draek,好點。但是,您可以使用名爲ShowInTaskbar和WindowState的屬性組合來實現類似的功能。我將其添加爲答案。 – 2012-02-08 07:49:13

回答

22

無論您在表單顯示之前您嘗試設置Visible屬性的多少,它都會彈出。據我所知,這是因爲它是當前ApplicationContext的MainForm。自動加載表單但不在應用程序啓動時顯示的一種方法是更改​​Main方法。默認情況下,它看起來像這樣(.NET 2。0 VS2005):

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

如果你不是做這樣的事情,該應用程序將啓動,加載形式和運行,但表單不會顯示:

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Form1 f = new Form1(); 
    Application.Run();   

} 

我不完全知道如何這是有用的,但我希望你知道; o)

更新:似乎你不需要將Visible屬性設置爲false,或提供一個ApplicationContext實例(將自動爲您創建「油煙機「)。相應縮短代碼。

2

只需創建一個Form1的實例,並且不要調用顯示/顯示它的方法。但我敢打賭你做錯了什麼。

0

有你的form_loadform_activated事件

+0

僅供參考,在form_load事件中使用時不起作用,但在form_activated事件中起作用,儘管在隱藏之前顯示了分秒的表單。 – CraigTP 2009-04-30 14:06:02

1

上VisibleChanged事件嘗試嘗試

this.Hide(); 

+0

我會盡力的。 – BuddyJoe 2009-04-30 14:48:27

1

我想建議的是在IntializeComponent()調用之後,在_Show事件之前的事件(例如構造函數)中實例化表單。

+0

我想也許你的意思是隱藏而不是實例化,對嗎?在任何情況下(不是雙關語),你必須確保無論你在哪裏調用它,都會發生在表單可見的調用之後,但在它實際成爲可見之前發生。 – 2009-04-30 13:56:11

+0

其實我提出了一個方法來初始化顯示錶單之前的任何必要的東西。 – 2009-04-30 14:01:58

+0

試過了。這沒有用。 – BuddyJoe 2009-04-30 14:48:52

0

設置構造器的公開程度,在init之後再this.Show()後

1

所顯示的事件可能給你想要你想要的。雖然表格在隱藏之前會「閃現」一秒鐘。

private void Form1_Shown(object sender, EventArgs e) 
    { 
     this.Visible = false; 
    } 
0

的InitializeComponent()被設置THIS.VISIBLE = TRUE,因爲你指定的形式應該是在設計師可見的(或者默認爲是)。您應該在設計器中將Visible設置爲false,並且不會被InitializeComponent()調用。然後,您可以隨時將其顯示出來。

0

Load事件有.Visible = falseHide()會導致您的形式簡要介紹,因爲是當它變成實際可見之間時間的Load事件被炒魷魚,儘管事實是,文件說的相反。

你打電話給Show()還是ShowDialog()?我不確定這種行爲是否仍然存在,但至少在框架的過去版本中,調用ShowDialog()並未觸發Load事件,所以也許這就是您的問題(儘管我認爲調用ShowDialog()然後隱藏了模式表單會是一個不好的做法!)

如果你不得不爲你想要做的任何事情創建句柄(和控制手柄),更好的辦法是將StartLocation設置爲Manual,然後設置將Position屬性移至屏幕外位置。這將創建並顯示錶單,同時使其對用戶不可見。

1

如果這是您的主要表單,那麼Shown事件可能沒有更好的地方。但在這種情況下,你會閃爍。

我無法找到一個合適的位置來阻止正在運行的主表單至少快速顯示。即使在加載事件中激活的計時器也不會這樣做。

如果它是一個輔助形式,只是創建它,但不顯示它。

0

是的,對於代碼來說,真正的一種優雅方式比你的應用程序視覺效果隱藏在構造函數/加載事件中來閃爍窗體。

10

我花了一些時間才找到一個正常工作的解決方案。

在屬性窗口中將名爲WindowState的屬性設置爲最小化並將ShowInTaskbar設置爲False。完成加載表單後,請在代碼行下方撥打電話。

 this.ShowInTaskbar = true; 
     this.WindowState = System.Windows.Forms.FormWindowState.Maximized; 
     //this.WindowState = System.Windows.Forms.FormWindowState.Normal; 

PS:這個解決方案測試基於Visual C#2008 Express Edition的

11

我知道這是一個老問題,但我只是偶然發現了它,我很驚訝,沒有人提到SetVisibleCore

bool isVisibleCore = false; 
protected override void SetVisibleCore(bool value) 
{ 
    base.SetVisibleCore(isVisibleCore); 
} 

在該代碼片段中,只要isVisibleCore保持爲假,表單將保持不可見狀態。如果在表單被實例化時設置爲false,那麼如果您在Shown事件中設置了Visible = false,則不會獲得您獲得的簡短可見性。

2

如何在設計時將不透明度屬性設置爲0,並在要顯示錶單時將其設置爲100?

2

我可以與 住在一起的解決方案,因此創建窗體並在創建時調用on_load。 集的WindowState最小化,然後負載設置爲false的WindowState可見正常

private void Form1_Load(object sender, EventArgs e) 
{ 
     this.Visible = false; 
     this.WindowState = FormWindowState.Normal; 
} 

什麼也沒有奏效:

的SetVisibleCore清除溶液沒有創建的形式

成也

Application { 
Form1 f = new Form1(); 
Application.Run(); 

):

1

對於無閃爍的顯示的解決方案,關屏負載時,也設置窗體的位置:

private Point startuplocation; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.startuplocation = this.Location; 
    this.Location = new Point(-1000, -1000); 
} 

private void Form1_Shown(object sender, EventArgs e) //fires first time shown 
{ 
    this.Visible = false; 
    this.Location = this.startuplocation; 
} 
0

我同意,這可真讓人鬱悶,因爲通常的WinForms不看漂亮,當他們初始化一堆控件或填充一個大的DataGridView或其他。你仍然需要窗口句柄來存在,然後才能創建所有提到的問題。

這裏有一些對我有用的東西,你有兩種選擇:你可以隱藏你的主窗體,直到它準備好,或者你可以顯示某種小閃屏讓你的用戶知道你正在工作它。請享用。

public partial class MainForm : Form 
{ 
    public MainForm() 
    { 
     InitializeComponent(); 
    } 
    Size mDeferredSize; 
    protected override void OnHandleCreated(EventArgs e) 
    { 
     // Capture the "real" size... 
     mDeferredSize = Size; 
     // and set it to nothing... 
     Size = new Size(0, 0); 
     DoSomeUglyInitialization(showOptionalSplash: true); 
     Size = mDeferredSize; // ...and now put it back to the original size  
     base.OnHandleCreated(e); 
    } 
    private void DoSomeUglyInitialization(bool showOptionalSplash) 
    { 
     MySplash splash = null; 
     if (showOptionalSplash) 
     { 
      // We have made some borderless form class with a logo or something... 
      splash = new MySplash(); 
      splash.Show(); 
     } 
     // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
     // Initialization that REQUIRES A HANDLE, e,g, 
     // we might be creating a bunch of controls, or 
     // populating a big DataGridView. Whatever it is, 
     // we don't want everyone looking at our biz. 
     System.Threading.Thread.Sleep(2500); // (Here simulated...) 
     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
     splash?.Dispose();  
    } 
} 
相關問題