与我的previous question相关。
在我之前的问题中,我问为什么我的对话框似乎在其他窗口后面打开。 (其他窗口不一定属于我的程序,例如Excel,Windows资源管理器等)
我被告知要使用重载ShowDialog()
并将父项作为参数传递。
没关系,我已经用重载替换了所有的ShowDialog()。
但是我仍然遇到同样的问题:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
OpenFileDialog ofd = new OpenFileDialog();
ofd.ShowDialog(); // First dialog
// Do some stuff here...
SaveFileDialog sfd = new SaveFileDialog();
sfd.ShowDialog(); // Second dialog;
}
}
在这个例子中(不要对代码发表评论 - 我只是将其作为一个简单的例子编写),用户双击其屏幕上有几个窗口的可执行文件。 OFD显示在顶部,SFD显示在所有内容之下。
我通常在我的简单程序中设置这种OFD / SFD,它接受CSV或XLS文件并对它们进行一些简单的处理。在这种情况下,我将OFD代码放在静态Main()方法中,如果没有参数传递给exe,则加载对话框。
答案 0 :(得分:11)
还有另一个 - 我认为最简单的解决方案:
ofd.ShowDialog(new Form() { TopMost=true });
它会打开一个新表单,会立即处理,但它会为您的ofd提供TopMost属性。您可以提供更多属性,例如“TopLevel”:
ofd.ShowDialog(new Form() { TopMost=true, TopLevel=true });
答案 1 :(得分:3)
c#console应用程序文件夹浏览器对话框TopMost c#console应用程序打开文件对话框TopMost
[STAThread]
static void Main(string[] args)
{
var threadFolderBrowserDialog = new Thread(voidFolderBrowserDialog);
threadFolderBrowserDialog.IsBackground = true;
threadFolderBrowserDialog.SetApartmentState(ApartmentState.STA);
threadFolderBrowserDialog.Start();
Console.WriteLine("Запуск выбора папки и файла в новом потоке");
bool Exit = false;
while (!Exit)
{
var exit = Console.ReadLine() == "exit" ? Exit = true : Exit = false;
Console.WriteLine("Выход из программы по команде exit");
}
}
[STAThread]
static void voidFolderBrowserDialog()
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog(new Form() { TopMost = true, WindowState = FormWindowState.Minimized }) == DialogResult.OK)
{
Console.WriteLine(fbd.SelectedPath);
}
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog(new Form() { TopMost = true, WindowState = FormWindowState.Minimized }) == DialogResult.OK)
{
Console.WriteLine(ofd.FileName);
}
}
答案 2 :(得分:2)
你可以尝试类似下面的内容(有点hacky):
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Form dummyForm = null;
// Create a 'pseudo' invisible form that we make temporarily topmost
dummyForm = new Form() { ShowInTaskbar = false, WindowState = FormWindowState.Minimized };
dummyForm.Show();
dummyForm.TopMost = true;
dummyForm.TopMost = false;
// Use the dummy form as our parent
OpenFileDialog ofd = new OpenFileDialog();
ofd.ShowDialog(dummyForm); // First dialog
// Do some stuff here...
SaveFileDialog sfd = new SaveFileDialog();
sfd.ShowDialog(dummyForm); // Second dialog;
}
}
表单使您可以将ShowDialog与父窗口句柄一起使用,并且最小化启动它的技巧克服了直接修改表单可见性的主要问题(这可能导致窗体的窗口句柄未被创建)
答案 3 :(得分:1)
我知道你想要避开最顶层,但你可以尝试设置它,然后立即取消设置。我在我的一个应用程序中做到了这一点,它对我有用。
答案 4 :(得分:1)
模态对话框并不是以这种方式使用的,尽管没有什么能阻止你这样做。
shsmith说,你必须有一个Application.Run
。
对于您在问题中给出的简单示例,我会看到一个带有进度条和/或滚动日志状态文本的小窗口。