我正在编写一个可以接受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
...
}
答案 0 :(得分:1)
我知道这并没有直接回答这个问题,但是OpenFileDialog有一个名为“MultiSelect”的属性,它指示用户是否可以选择多个文件。一旦用户选择了文件,属性FileNames(string [])将填充所有文件名。然后你可以像这样做一个检查:
if(dialog.FileNames.Length > 3)
{
//only 3 are allowed
}
答案 1 :(得分: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;
}
答案 2 :(得分: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);
...
答案 3 :(得分:0)
找到了类似的帖子here。没有经过测试,但请试一试,让我知道。
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);
}
}
}
答案 4 :(得分:0)
OpenFileDialog.ShowDialog可以 用“父窗口”句柄调用 论点。我创建了一个虚拟表格和 将其用作父窗口参数 (假的形式是看不见的,因为我 不要在上面调用Show())。
表格有点重,可能是标签,因为它只需要一个IWin32Window?
OpenFileDialog.ShowDialog(new Label());
似乎有效。
如果有人能够对这个(现在)复活的问题提出合理的解决方案,那就太棒了。
亚伦