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;

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

更新 这是 Main 方法的样子。我正在尝试将依赖项注入所有元素。我已更改名称以删除客户名称。

[STAThread] 静态无效 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

我最终寻求的解决方案似乎有效的解决方案是从对 Application.Run() 的调用中删除 mainForm 并在调用 Application.Run() 之前立即调用 mainForm.show() 然后调用 mainForm.Hide()

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

Application.Run();

似乎正在工作。

于 2012-08-04T10:00:14.983 回答
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 回答