【发布时间】:2014-01-24 17:37:22
【问题描述】:
我有表单:Splashscreen、Search 和 NewEntry
Program.cs 启动 Splashscreen,它会检查一些参数,并在成功时(检查用户名、权限等)打开 Search 表单。从那里我可以拨打NewEntry 表格。
因此,由于Splashscreen 是Main() 函数调用的主要形式,因此一旦关闭,应用程序就会关闭(这是预期的行为)。
所以我所做的是从Splashscreen 内部启动Search 表单作为对话框并隐藏Splashscreen,所以它等待Search 关闭。它一关闭,我也关闭了Splashscreen,当时这一切似乎都说得通。从Search 表单我打开NewEntry 表单(通过按钮单击)也作为一个对话框(我不希望用户来回单击并创建多个NewEntry 窗口)。
今天我不得不添加一个允许用户选择文件的功能。作为一个显而易见的选择,我使用了OpenFileDialog。但是只要我调用.ShowDialog() 方法,整个应用程序就会冻结。
我在这里和其他网站上阅读了Windows Forms GUI hangs when calling OpenFileDialog.ShowDialog() 和OpenFileDialog.ShowDialog() freezing application c# 以及许多其他帖子,当我几乎失去希望时,我遇到了这个http://wishmesh.com/2011/06/call-to-openfiledialog-or-savefiledialog-hangs-or-freezes/
我的Main() 函数上确实设置了[STAThread] 属性
一个特别的兴趣点是:对于 OpenFileDialog,必须显式设置 ShowHelp 属性。
还有 ...它们不必设置为 true,只需将它们初始化为 true 或 false。
所以当我将ShowHelp 设置为true 时,会出现对话框(带有无用的帮助按钮)。
进一步的研究表明,当我在Program.cs 或Splashscreen 内执行(new OpenFileDialog()).ShowDialog(); 时,它工作得很好;但是,当从对话框中调用时,会出现挂起(没有ShowHelp)。此外,MessageBox 从Dialog 中显示得很好...
那么有没有办法让这个工作?还是我应该以不同的方式管理我的窗户?
比如有Search作为主启动窗口,那么在窗口显示之前,调用Splashscreen作为对话框,如果失败,就关闭主窗口?但是,我将如何处理NewEntry 才能显示OpenFileDialog 或FolderBrowserDialog?
谢谢。
【问题讨论】: