Заставить второй и третий OpenFileDialog появиться над консолью в .NET / C #? - PullRequest
0 голосов
/ 08 мая 2009

Я пишу консольную программу, которая может принимать от 1 до 3 файлов. Я использую OpenFileDialog три раза, чтобы принять файлы, но второй и третий раз диалог файлов находится за окном консоли, что затрудняет его заметку. Есть ли способ заставить его появиться выше?

Изображение проблемы:

enter image description here

Соответствующий код:

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
    ...
}

Ответы [ 5 ]

1 голос
/ 09 января 2012

Для меня фиктивные формы и этикетка все еще не решили проблему. 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);
...
1 голос
/ 08 мая 2009

Я знаю, что это не дает прямого ответа на вопрос, но OpenFileDialog имеет свойство MultiSelect, которое указывает, может ли пользователь выбрать несколько файлов. Как только пользователь выберет файл (ы), свойство FileNames (string []) заполняется всеми именами файлов. Затем вы можете просто сделать проверку следующим образом:

if(dialog.FileNames.Length > 3)
{
   //only 3 are allowed
}
1 голос
/ 09 июня 2009

Я столкнулся с той же проблемой в консольном приложении.

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;
}
0 голосов
/ 16 декабря 2009

OpenFileDialog.ShowDialog может быть вызывается с дескриптором «родительского окна» аргумент. Я создаю фиктивную форму и использовать это как аргумент родительского окна (фиктивная форма невидима, так как я не вызывайте Show () для этого).

Форма немного тяжеловесна, возможно, вместо метки, поскольку она просто берет окно IWin32Window?

OpenFileDialog.ShowDialog(new Label());

Кажется, работает.

Если бы кто-то смог найти разумное решение этого (сейчас) воскресшего вопроса, это было бы здорово.

Aaron

0 голосов
/ 08 мая 2009

Нашел похожий пост здесь . Не проверено, но сделайте попытку и дайте мне знать.

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