4

Visual C# 2010 アプリケーションがあり、MainWnd他のツール ウィンドウとダイアログで呼び出されるメイン フォームが 1 つあります。他のツール ウィンドウがメイン フォームと「会話」し、そのメソッドを呼び出せるようにしたいと考えています。しかし、それには のインスタンスが必要でありMainWnd、これらのフォームは一度に 1 つしか作成されないため、 のすべてのインスタンスを列挙し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();

どうすればこれを達成できますか?

4

3 に答える 3

3

おそらく、メイン ウィンドウをシングルトンにする方法を見つけることができますが、それは目的の結果を達成するための最良の方法ではなく、シングルトン パターンを使用するのに適切な状況でもありません。

他のすべてのツール ウィンドウ/ダイアログがメイン ウィンドウ内にカプセル化されている場合、通信に使用するより優れたパターンはイベントです。

内側のウィンドウ/ダイアログにイベントを発生させて、メイン ウィンドウが何かを実行するための「要求」を表します。メイン ウィンドウでこれらのイベントをサブスクライブし、イベント ハンドラーを介して作業を行います。

シングルトン アプローチを回避することで、シングルトンのテストの困難さを回避し、メイン ウィンドウがカプセル化されたウィンドウ/ダイアログへの参照を持っているだけでなく、それらがカプセル化されたウィンドウ/ダイアログへの明示的な参照を持っている場合に、大規模な明示的な循環参照を回避します。メインウィンドウ。

于 2013-01-14T05:29:08.000 に答える
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 すべてのメンバーはインスタンスでも使用できます。

于 2013-01-14T05:31:31.850 に答える
0

あなたは確かにこれを行うことができます.

 public MainWnd Instance = new MainWnd();

次に、としてアクセスしMainWnd.Instance.SayHello()ます。

次の呼び出しを置き換えます

MainWind instance = new MainWnd();

 MainWnd instance = MainWnd.Instance;

ただし、コンストラクターをプライベートにした後、Visual Studio デザイナーがどのように反応するかはわかりません。ただし、許可されない場合は、言語/コンパイラの問題ではなく、Visual Studio の問題になります。

于 2013-01-14T05:26:07.837 に答える