C#Windows无法在顶部打开

时间:2011-05-30 02:07:00

标签: c# winforms

与我的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,则加载对话框。

5 个答案:

答案 0 :(得分:11)

还有另一个 - 我认为最简单的解决方案:

        ofd.ShowDialog(new Form() { TopMost=true });

它会打开一个新表单,会立即处理,但它会为您的ofd提供TopMost属性。您可以提供更多属性,例如“TopLevel”:

        ofd.ShowDialog(new Form() { TopMost=true, TopLevel=true });

答案 1 :(得分:3)

c#c​​onsole应用程序文件夹浏览器对话框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

对于您在问题中给出的简单示例,我会看到一个带有进度条和/或滚动日志状态文本的小窗口。