我正在编写一个必须隐藏主窗体的应用程序,但它会在启动时显示对话框。
我的主窗体在构造函数调用的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);
}
答案 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();
似乎正在发挥作用。