2013-01-14 44 views
4

我有一個Visual C#2010應用程序,它有一個名爲MainWnd的主窗體以及其他工具窗口和對話框。我希望其他工具窗口能夠與主窗體「交談」,並調用其方法。但是這需要一個MainWnd的實例,並且由於在任何給定時間只會創建這些表單中的一個,所以我沒有理由列舉MainWnd的所有實例或查找第一個。所以我想我的主要申請表MainWnd是一個單身人士,所以其他窗口可以很容易地從它調用代碼。我可以製作一個單獨的表單嗎?

這裏是主要形式的代碼,我想提出一個單身:

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace MyLittleApp 
{ 
    public partial class MainWnd : Form 
    { 
     public MainWnd() 
     { 
      InitializeComponent(); 
     } 

     public void SayHello() 
     { 
      MessageBox.Show("Hello World!"); 

      // In reality, code that manipulates controls on the form 
      // would go here. So this method cannot simply be made static. 
     } 
    } 
} 

我期待能夠調用SayHello()從另一種形式,簡單地寫:

MainWnd.SayHello(); 

我怎麼能做到這一點?

+0

你不能把它作爲一個靜態的公共方法,然後做你在說什麼? – ryadavilli

+1

因爲它被稱爲MainWnd我期望,表單打開其他形式。在這種情況下,您可以在您的子表單上使用事件,並在此處註冊來自MainWnd的事件接收器。 – TGlatzer

+0

@ryadavilli正如我發佈的代碼中的評論所說,該方法操縱表單中的對象,所以它必須有一個實例,因此它不能僅僅是靜態的。 –

回答

3

你或許可以找到一種方法來使主窗口成爲單例,但這不是實現所需結果的最佳方式,也不是真正適合使用單例模式的情況。

如果所有其他工具窗口/對話框都封裝在主窗口中,那麼用於通信的更好的模式就是事件。

讓內部窗口/對話框引發事件來表示主窗口執行某些操作的'請求'。讓主窗口訂閱這些事件,並通過事件處理程序完成工作。

通過避免單例方法,避免了測試單例的困難,也避免了大量顯式循環引用,其中主窗口不僅包含對封裝窗口/對話框的引用,而且它們又具有顯式引用回主窗口。

+0

+1肯定比我想的要好。感謝您打開我的眼睛,以更好的設計模式:) –

0

你當然可以做到這一點。

public MainWnd Instance = new MainWnd(); 

然後以MainWnd.Instance.SayHello()的身份訪問。

更換以下呼叫

MainWind instance = new MainWnd(); 

MainWnd instance = MainWnd.Instance; 

我不知道使構造私人雖歷經Studio如何可視化設計器會有什麼反應。 但是,如果它不允許,它將是Visual Studio的問題,而不是語言/編譯器問題。

1

見下文。

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace MyLittleApp 
{ 
    public partial class MainWnd : Form 
    { 
     public static MainWnd Instance; 
     public MainWnd() 
     { 
      Instance = this; 
      InitializeComponent(); 
     } 

     public void SayHello() 
     { 
      MessageBox.Show("Hello World!"); 

      // In reality, code that manipulates controls on the form 
      // would go here. So this method cannot simply be made static. 
     } 
    } 
} 

現在,您可以通過調用MainWnd.Instance 在任何地方使用它在你的代碼的所有成員也可到該實例。

相關問題