1

メイン フォームを非表示にする必要があるアプリケーションを作成していますが、起動時にダイアログが表示されます。

私のメイン フォームには、コンストラクターによって呼び出される initialize() メソッドに次の行があります。

this.Load += new System.EventHandler(this.MainForm_Load);

上記のコードがヒットすることを確認しましたが、 MainForm_Load() メソッドは呼び出されません。

これは、フォームを非表示にしているためでしょうか?

Program.cs の Main で次の行を実行します。

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

そして、フォームで次のメソッドをオーバーライドしました:

protected override void SetVisibleCore(bool value)
{
    _logger.Debug("Hiding the main window");
    base.SetVisibleCore(allowShowDisplay ? value : allowShowDisplay);
}

allowShowDisplay が false に設定されている場合。

この質問への回答でこのソリューションの少なくとも一部を見つけ、別のプロジェクトで使用しました。ただし、そのプロジェクトはフォーム読み込みイベントを使用しませんでした。私が取り組んでいるものはそうです。

UPDATE Main メソッドは次のようになります。すべての要素に依存関係を注入しようとしています。名前を変更して、顧客名を削除しました。

[STAThread] static void Main() {

        ServiceHost incomingPipeHost = new ServiceHost(typeof(ScreenPopService));
        incomingPipeHost.Open();

        XmlConfigurator.Configure();
        _logger.Debug("Starting Application");
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        _logger.Debug("Creating subformView"); 
        ISubformView subformView = new SubformView();

        _logger.Debug("Creating MainForm mainForm");
        MainForm mainForm = new MainForm();

        _logger.Debug("Creating MonitorController");
        IMonitorController MonitorController = new MonitorController();

        _logger.Debug("Adding View to MonitorController");
        MonitorController.View = mainForm;

        _logger.Debug("Adding subFormView to mainForm");
        mainForm.SubFormView = subFormView;

        _logger.Debug("Adding MonitorController to mainForm");
        mainForm.MonitorController = MonitorController;

        _logger.Debug("Loading Properties");
        IProperties properties = PropertiesManager.LoadProperties();

        _logger.DebugFormat("Loaded Properties [{0}]", properties);
        _logger.Debug("Setting properties on mainForm");
        mainForm.Properties = properties;

        _logger.Debug("Setting properties on MonitorController");
        MonitorController.Properties = properties;

        _logger.Debug("Settting ScreenPop Consumer on MonitorCotroller");
        MonitorController.screenPopConsumer = ScreenPopCallBackManager.Instance;

        _logger.Debug("Debug Running Application");

        Application.Run(mainForm);
    }
4

4 に答える 4

4

これは仕様によるものです。フォームの Visible プロパティ (および関連する SetVisibleCore メソッドと Show メソッド) は、Winforms では重要です。典型的な .NET の怠惰な方法では、それが具体的なウィンドウを作成するものです。つまり、Winforms は必要でない限りウィンドウを作成しませ

SetVisibleCore() をオーバーライドし、valueプロパティを強制的に false に設定することで、これが発生しなくなります。ウィンドウは作成されませ。また、Load イベントの発生など、他の多くのことは発生しません。また、フォームの Close() メソッドを呼び出しても、通常のようにプログラムは停止しません。

これはすべて正常な動作です。Load イベント ハンドラーに重要な要素が含まれている場合は、必ずコンストラクターに移動してください。ウィンドウのサイズと位置を知るために必要なのは Load だけです。

于 2012-08-03T16:59:34.907 に答える
0

Program.csファイル内でMDIを使用する方法としてこれを投稿しています。これは、私のコードがどのように見えるかです。

静的クラスプログラム

{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        try
        {
            Application.Run(new MainForm());
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + "\n\n\n" + ex.GetType().ToString(), "Error in MainForm");

        }
    }
}

これで、非表示にしてから表示したいフォームのコードは、MainFormに次のコードが含まれるようになります。これは、フォームが読み込まれ、メニュークリックイベントを使用した場合の例です。しかし、MDIはあなたが見たいものです..あなたのユースケースで機能するように例を変更してください。

    private void newStudentRecordToolStripMenuItem_Click(object sender, EventArgs e)
    {
        try
        {
            StudentForm studForm = new StudentForm();
            studForm.MdiParent = this;
            studForm.Show();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + "\n\n\n" + ex.GetType().ToString(), "Error in Student Form");
        }
    }
于 2012-08-03T14:56:06.657 に答える
0

MainForm_Load のメソッド シグネチャを再確認することをお勧めします。署名は「MainForm_Load(object sender, System.EventArgs e)」のようになります。

これは不自由に聞こえるかもしれませんが、私はそのような問題に時間を費やしてきました:)

これが役立つかどうか教えてください。ありがとう!

于 2012-08-03T15:12:46.323 に答える
0

私が最終的に行った解決策は、Application.Run() への呼び出しから mainForm を削除し、mainForm.show() を呼び出してから、Application.Run() への呼び出しの前に mainForm.Hide() を呼び出すことです。

mainForm.Show();
mainForm.Hide();

Application.Run();

動作しているようです。

于 2012-08-04T10:00:14.983 に答える