2014-03-13 66 views
0

我使用Visual Studio的窗體設計最初奠定了我的Windows桌面應用程序的表單中初始化通過窗體設計器創建表單元素。這裏是我的自動生成InitializeComponent()方法的表單中的內容的一個片段:動態移動和形式啓動

// ... 
this.Controls.Add(this.menuStrip1); 
this.Controls.Add(this.panel1); 
this.MainMenuStrip = this.menuStrip1; 
this.Name = "Form1"; 
this.Text = "Form1 Title"; 
this.menuStrip1.ResumeLayout(false); 
this.menuStrip1.PerformLayout(); 
this.toolStrip1.ResumeLayout(false); 
this.toolStrip1.PerformLayout(); 
// ... 

我想這樣做是注入的是移動的過程中,調整大小,並在初始化的形式和它的幾個控制啓動過程。我相信這樣做的理想場所是在第一次致電ResumeLayout()之前。

方便的是,我發現我可以重寫我的形式Text Property

public override String Text 
{ 
    set 
    { 
     if (!this.formInitialized) 
     { 
      DoSpecialFormInitialization(); 
      this.formInitialized = true; 
     } 

     base.Text = value; 
    } 
} 

雖然我發現,這種方法確實工作,它讓我覺得有可能是一個更好的辦法達到我的目標。有沒有更好的方法,最好是不需要更多努力的方法?

更新:正如我在響應由@Grant Winney答案評論所指出的,我知道我可以做我的初始化形式的構造函數,調用InitializeComponent()以下。但我試圖避免所有的呼叫重複到SuspendLayout()ResumeLayout()(見InitializeComponent()內部),因爲我相信這會降低性能並可能導致未來的維護問題。

不幸的是,它是足夠簡單地只是父窗體上調用SuspendLayout()ResumeLayout()。這是信息,爲什麼從an article(見第三段)由@Grant引用:

請記住,只有SuspendLayout防止被該特定控制執行 佈局事件。例如,如果將控件添加到 面板中,則必須調用面板的 SuspendLayout和ResumeLayout,而不是父窗體。

回答

1

兩個想法:

  1. 你可以稱之爲從構造函數的方法來移動控件。這似乎不那麼「黑客」,因爲它不依賴於所設置的表單上的某個其他屬性的副作用。

    (另外,如果有人修改了未來在運行時更改窗口文本的代碼,他們會在不經意間再次運行初始化代碼。)

    public class MyForm : Form 
    { 
        public MyForm() 
        { 
         InitializeComponent(); 
    
         DoSpecialFormInitialization(); 
        } 
    } 
    
  2. 使用此謹慎。當表單在設計器中看起來是一種方式時,維護變得非常困難,並且在運行時是12種不同的方式之一。

+0

** 1。**是的,這是我嘗試的第一種方法。但是,我發現我需要重複所有對'InitializeComponent()'中出現的'SuspendLayout()'和'ResumeLayout()'的調用。 ** 2。**我的表單有幾個面板,在任何給定的時間只有其中一個可見。在設計師中,我佈置了所有面板,然後摺疊主窗體並在啓動時顯示第一個面板。 – DavidRR

+0

更多:每個面板在窗體上佔據相同的位置。我所做的就像一個巫師。我在左邊的'TreeView'驅動窗體的其餘部分。單擊「TreeView」中的節點將顯示與該特定節點類型關聯的面板。 – DavidRR

+1

我想這並不壞。我已經看到它在一些遺留代碼中變得極端,在這些代碼中面板被移動,然後在面板內控制,然後文本被更改,yadda yadda。 :) –