创建控制台,如进度窗口

时间:2013-02-21 17:11:23

标签: wpf mvvm batch-file console messagebox

我用一个WPF可执行文件替换了几乎完全相同的批处理文件。我编写了程序,但是我的“控制台”就像显示器一样麻烦。

在程序中,我调用可执行文件来执行任务。此可执行文件将其输出消息发送到控制台。我可以将它们重定向到我的“控制台”,如下所示。

Process p = new Process();
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;

p.StartInfo.FileName = MyExecutable;
p.StartInfo.Arguments = MyArguments;
p.Start();

while (!p.StandardOutput.EndOfStream)
{
   string _output = p.StandardOutput.ReadLine();

   // This is my display string ObservableCollection
   _displayString.Add(new DisplayData { _string = _output, _color = System.Windows.Media.Brushes.Black, _fontSize = 12 });

   // This is to redirect to a Console & what I want to get rid of 
   Console.WriteLine(_output);
}

p.WaitForExit();

当可执行文件运行完毕后,我使用MessageBox询问用户是否要再次运行可执行文件。问题是当MessageBox启动时,用户无法在我的“控制台”窗口上滚动以做出信息性的决定。要暂时解决这个问题,我在启动时启动控制台,请参阅this,并将运行可执行文件的进程的输出流写入控制台,以便用户可以滚动查看信息并做出决定。

我使用列表框来显示一组文本块,请参阅this。我不喜欢制作显示器或MessageBox'es。

如何创建一个“控制台”,如显示器,它将接受用户输入(MessageBox,直接输入等...),还允许他们在做出决定之前滚动数据?

修改 至于我收到的评论,我不清楚我想要完成什么。我有一个批处理文件,每次运行多次运行可执行文件。在可执行调用之前和之间有很多设置。我创建了一个可执行文件来替换许多类似的批处理文件,并带有下拉菜单,供用户在运行时更改设置。当用户喜欢他们的设置时,他们点击“开始”按钮,然后离开它进行设置并提示问题,然后最终第一次运行可执行文件。

我的问题是,当我的内部调用的可执行文件完成运行时,用户需要根据不同的原因决定是否要再次运行它。我需要提示用户“再次运行 - '是'或'否'?”,这就是我遇到问题的地方。 MessageBox不允许我在Progress Window上滚动。我尝试过一个无模式对话框,但是使用Show()程序继续,ShowDialog()与MessageBox是同一个问题。

有关如何执行此操作的任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

您在Windows中,但尝试使用DOS范例。 Windows是基于事件的系统!您需要编写“事件处理程序”,但不要将全部代码放在一个函数中。

然而,有一个技巧,允许在Modeless中显示Modal(读取“阻止你的代码”)对话框(阅读“不阻止你的窗口”)。不知道如何在WPF中实现这一点,但想法是重新启用您的窗口(它充当您的对话框的父级)。您需要在对话框事件处理程序(WM_INITDIALOG等效?)中执行此操作。

另外(在WinAPI中)您可以使用NULL作为父窗口运行对话框。