0

我正在编写一个可以接受 1 到 3 个文件的控制台程序。我使用OpenFileDialog了三次来接受文件,但第二次和第三次文件对话框位于控制台窗口后面,很难注意到。有什么办法让它出现在上面吗?

问题的图像:

在此处输入图像描述

相关代码为:

static bool loadFile(ref List<string> ls)
{
    OpenFileDialog f = new OpenFileDialog();
    if (f.ShowDialog() == DialogResult.OK)
    {
        Console.WriteLine("Loaded file {0}", f.FileName);
        ls.Add(f.FileName);
        return true;
    }
    else
    {
        return false;
    }
}

[STAThread]
static void Main(string[] args)
{
    // sanity check
    if (args.Length > 3)
    {
        Console.WriteLine("Sorry, this program currently supports a maximum of three different reports to analyze at a time.");
        return;
    }
    else if (args.Length == 0) 
    {
        List<string> fL = new List<string>();

        for (int k = 0; k < 3; k++)
        {
            if (!loadFile(ref fL)) break;
        }

        if (fL.Count == 0)
        {
            InfoDisplay.HelpMessage();
            return;
        }
        else
        {
            args = fL.ToArray();
        }
    }

    // main program
    ...
}
4

5 回答 5

1

我在控制台应用程序中遇到了同样的问题。

可以使用“父窗口”句柄参数调用 OpenFileDialog.ShowDialog。我创建了一个虚拟表单并将其用作父窗口参数(虚拟表单是不可见的,因为我没有在其上调用 Show())。

以下代码适用于我:

Form dummyForm = new System.Windows.Forms.Form();

OpenFileDialog myOpenFileDialog1 = new OpenFileDialog();  
if (myOpenFileDialog1.ShowDialog(dummyForm) == DialogResult.OK) {  
    fileName1 = myOpenFileDialog1.FileName;  
}

OpenFileDialog myOpenFileDialog2 = new OpenFileDialog();
if (myOpenFileDialog2.ShowDialog(dummyForm) == DialogResult.OK) {
    fileName2 = myOpenFileDialog2.FileName;
}
于 2009-06-09T09:36:27.970 回答
1

我知道这并不能直接回答问题,但 OpenFileDialog 有一个名为“MultiSelect”的属性,它指示用户是否可以选择多个文件。一旦用户选择了文件,属性 FileNames (string[]) 就会填充所有文件名。然后,您可以像这样进行检查:

if(dialog.FileNames.Length > 3)
{
   //only 3 are allowed
}
于 2009-05-07T23:29:40.157 回答
1

对我来说,虚拟表格和标签仍然没有解决问题。CodeProject 在http://www.codeproject.com/KB/WPF/MessageBox.aspx有部分解决方案

然后你可以Process.GetCurrent.Process.MainWindowHandle在上面文章中的类的构造函数中使用,然后将实例传递给文件对话框,它似乎工作得很好(至少对我来说)。

Process p = Process.GetCurrentProcess();
WindowWrapper w = new WindowWrapper(p.MainWindowHandle);
OpenFileDialog ofd = new OpenFileDialog();
var ret = ofd.ShowDialog(w);
...
于 2012-01-09T10:00:44.403 回答
0

在这里找到了一个类似的帖子。未经测试,但试一试,让我知道。

foreach(Process p in Process.GetProcesses)
{
    if(p.MainWindowTitle = <the main UI form caption>)
    {
        if(IsIconic(p.MainWindowHandle.ToInt32) != 0)
        {
            ShowWindow(p.MainWindowHandle.ToInt32, &H1);
            ShowWindow(f.Handle.ToInt32, &H1);
        }
        else
        {
            SetForegroundWindow(p.MainWindowHandle.ToInt32);
            SetForegroundWindow(f.Handle.ToInt32);
        }
    }
}
于 2009-05-07T22:58:19.797 回答
0

可以使用“父窗口”句柄参数调用 OpenFileDialog.ShowDialog。我创建了一个虚拟表单并将其用作父窗口参数(虚拟表单是不可见的,因为我没有在其上调用 Show())。

Form 有点重,也许是一个标签,因为它只需要一个 IWin32Window?

OpenFileDialog.ShowDialog(new Label());

它似乎工作。

如果有人能为这个(现在)复活的问题提出一个合理的解决方案,那就太好了。

亚伦

于 2009-12-16T19:51:57.707 回答