表单加载不触发已隐藏的表单?

时间:2012-08-03 14:47:58

标签: c# winforms

我正在编写一个必须隐藏主窗体的应用程序,但它会在启动时显示对话框。

我的主窗体在构造函数调用的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;

我在this queston的答案中找到了至少部分此解决方案,并在另一个项目中使用过它。该项目并没有使用表单加载事件。我正在做的那个。

更新 这就是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 个答案:

答案 0 :(得分:3)

这是设计的。表单的Visible属性(以及相关的SetVisibleCore和Show方法)是Winforms中的一笔大交易。在典型的.NET懒惰时尚中,这就是创建具体窗口的原因。或者换句话说,Winforms不会创建窗口,除非具有到。

通过重写SetVisibleCore()并强制属性为false,可以阻止此操作发生。该窗口被创建。还有一些其他的东西不会发生,包括触发Load事件。调用表单的Close()方法不会像通常那样停止程序。

这都是正常行为。如果您的Load事件处理程序包含重要内容,请确保将其移动到构造函数中。您只需要加载即可知道窗口的大小和位置。

答案 1 :(得分: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");

        }
    }
}

现在我要隐藏的表单中的代码show将在我的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");
        }
    }

答案 2 :(得分:0)

我建议重新检查MainForm_Load的方法签名。签名应该看起来像“MainForm_Load(object sender,System.EventArgs e)”

这可能听起来很蹩脚,但我有这样的问题吃掉时间:)。

如果这有帮助,请告诉我。谢谢!

答案 3 :(得分:0)

我最终选择的解决方案似乎是有效的是从调用Application.Run()中调用mainForm并在调用Application之前调用mainForm.show()后紧跟mainForm.Hide()。 run()的

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

Application.Run();

似乎正在发挥作用。