Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#顶部未打开的车窗_C#_Winforms - Fatal编程技术网

C#顶部未打开的车窗

C#顶部未打开的车窗,c#,winforms,C#,Winforms,与我的工作有关 在我之前的问题中,我问为什么我的对话框似乎在其他窗口后面打开。(不一定属于我的程序的其他窗口,例如Excel、windows资源管理器等) 我被告知使用重载的ShowDialog()并将父对象作为参数传递 很好,我用重载替换了所有ShowDialog() 然而,我在这里仍然有同样的问题: static class Program { /// <summary> /// The main entry point for the application. //

与我的工作有关

在我之前的问题中,我问为什么我的对话框似乎在其他窗口后面打开。(不一定属于我的程序的其他窗口,例如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;
  }
}
静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
OpenFileDialog ofd=新建OpenFileDialog();
ofd.ShowDialog();//第一个对话框
//在这里做一些事情。。。
SaveFileDialog sfd=新建SaveFileDialog();
ShowDialog();//第二个对话框;
}
}
在这个示例中(不要对代码发表评论-我只是编写了一个简单的示例),用户双击可执行文件,屏幕上有几个窗口。OFD显示在顶部,SFD显示在所有内容的下方


我通常在我的简单程序中设置这种OFD/SFD,这些程序接受CSV或XLS文件,并对它们进行一些简单的处理。在本例中,我将OFD代码放在static Main()方法中,如果没有向exe传递任何参数,则加载对话框。

我知道您希望避免使用最顶层,但您可以尝试设置它,然后立即取消设置。我在我的一个应用程序中这样做了,对我来说效果不错。

你可以尝试以下类似的方法(有点黑):

静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
Form dummyForm=null;
//创建一个“伪”不可见表单,我们暂时将其置于最上面
dummyForm=new Form(){ShowInTaskbar=false,WindowState=FormWindowState.Minimized};
dummyForm.Show();
dummyForm.TopMost=true;
dummyForm.TopMost=假;
//使用虚拟窗体作为我们的父窗体
OpenFileDialog ofd=新建OpenFileDialog();
ShowDialog(dummyForm);//第一个对话框
//在这里做一些事情。。。
SaveFileDialog sfd=新建SaveFileDialog();
ShowDialog(dummyForm);//第二个对话框;
}
}

表单使您可以将ShowDialog与父窗口句柄一起使用,最小化启动它的技巧克服了直接修改表单可见性的主要问题(这可能会导致表单的窗口句柄无法创建)。

模态对话框不是以这种方式使用的,尽管没有什么能阻止你这么做

您必须有一个
应用程序。按照shsmith所说的运行


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

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

        ofd.ShowDialog(new Form() { TopMost=true });
它会打开一个新表单,该表单将立即被处理,但它会将最顶层的属性提供给您的ofd。您可以提供更多属性,如“TopLevel”:

c#控制台应用程序文件夹浏览器对话框顶部 c#控制台应用程序打开文件对话框顶部

    [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);
        }
    }

对话框不需要显示父窗口吗?你这里没有窗户,所以你不应该期望一切都像你期望的那样。你试过这个吗?:)我认为你们需要申请。像伞一样跑,以保持表格之间的信息传递。否则,当您的第一个表单退出并停止处理消息时,您将失去焦点。@Vimvq1987如果可能的话,我将尽量避免使用最上面的。@Shmith我认为您可能是对的,但是,不必要地将我的示例中描述的这样一个简单的程序复杂化似乎是一种耻辱。是的,这可能是一种解决方案,但正如我在删除的答案中所评论的,ShowDialog()正在阻塞,而Open/SaveFileDialogs没有最顶层的属性。我不会称之为“有点黑”。您也可以尝试通过p/invoke来处理SetWindowsPos(),尽管获取windows句柄非常难看,但这里可能有一些想法:这解决了我的问题,特别是
fbd.ShowDialog(新表单(){TopMost=true,WindowState=FormWindowState.Minimized})
        ofd.ShowDialog(new Form() { TopMost=true, TopLevel=true });
    [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);
        }
    }