Winforms没有主窗体的应用程序 - 顶部没有显示对话框

时间:2010-06-22 08:30:09

标签: .net winforms showdialog

我有一个winforms应用程序,它没有真正的主窗体 - 它只是一个简单的文件处理工具,因此它并不真正需要。

当应用程序启动时,首先使用OpenFileDialog选择文件。然后,使用Showdialog()显示一个对话框,其中包含有关如何处理所选文件的一些选项。最后,在操作文件时显示进度条表单,然后退出应用程序。

问题是,当我从Visual Studio进行调试时,中间窗体不会显示在其他打开的窗口之上,例如Visual Studio本身。当我运行已编译的可执行文件时,它似乎工作正常。

通常,当ShowDialog导致后面出现一个对话框时,解决方案是使用Showdialog(所有者)调用,除非我没有主表单可以说我没有所有者来设置

那么,如何让对话框以与OpenFileDialog自动相同的方式出现在其他窗口之上?

1 个答案:

答案 0 :(得分:3)

我确切地知道你在谈论什么,问题实际上是你的应用程序的设计不同意Windows处理焦点的方式。自win31以来,Windows已经完成了这类工作。这就像抢地;如果你从你的应用程序中显示一个窗口,然后隐藏/禁用它,你打盹,你输了根据比尔。修复:你需要一个主窗口!或切换操作系统。仅仅因为它在EXE中起作用并不意味着当你的一个用户从批处理文件或其他浏览器中删除它时它会起作用。

你可以克服自己的方式 - 运行3个独立的前任;尝试在子Main中运行3个Application.Run线程;使用SetTopMost,AppActivate自己。

或者查看如何让你的应用程序使用SDK调用来获取输入焦点 - 为了减轻使用它的讨厌的应用程序,后续版本的Windows变得困难(因此在w98中可以执行此操作的应用程序将闪烁任务栏xp中的橙色 - 当然程序员已经解决了这个问题。你可以这样做。

但你做错了。一个重构是有序的,并改变了未来的应用程序的策略。这不是我做出的决定;窗户工作的方式是一成不变的,加上用户期望它的工作方式设置在数以百万计的大脑中,这比石头更难 - 与流动一起游泳!

简单的重构,没有真正的影响:

  • 备份您的项目(或在TFS中保留副本)
  • 在选项对话框中,剪切所有控件。放入一个名为pnlOpts的表单大小的面板。粘贴它们。
  • 将该表格作为主要表格。
  • 在form_shown中,设置pnlOpts.Visible = false,或者只是默认它(你可以显示另一个带有应用名称的面板或背景图片,如果你想变得有点无用;-)
  • 调用也显示该区域文件dlg的设置代码
  • 设置您的文件dlg以将该表单作为父级,启动位置作为center-parent(我的意思是所有者而不是父级)。请记住从此处取消=关闭设置表单
  • 完成后,显示pnlOpts。
  • 在“确定”按钮中,调用执行进度条的代码。您可以再次隐藏或禁用pnlOpts。
  • 在ENTIRE窗口中,您无法隐藏,设置Visible = false或enabled = false,否则您将调用窗口的聚焦愤怒(这是您痛苦的原因)。

这里真正的关键,单行答案:让主窗口始终可见并启用,如果要禁用其功能,只需灰色或隐藏其所有控件。这是最简单的面板。如果需要,您可以向用户显示其他面板或图像以娱乐他们(特别是如果灰色[.enabled = false]内容没有意义)。

你不会喜欢这种看起来的方式,或者你已经开始构建它,但数百万行的Windows代码和数百万的Windows用户大脑现在被动地激烈地不同意你!