C# WPF 有助于 1. 删除列表框中的前两个条目或 2. 阻止它在输出中显示来自批处理的命令语法

C# WPF help in either 1. removing first two entries in listbox or 2. preventing it from displaying the command syntax from batch in output

这是我在 window_loaded 事件期间在我的 wpf 中调用的代码片段。它将执行一个批处理文件,并将结果输出到列表框中。但是,列表框中的第一个条目显示了批处理文件中的命令本身。我想删除第一个条目,或者如果不能以有效的方式完成,则首先阻止它显示它。

我试过使用项目计数删除,但它抛出了参数不足的异常。我有根据的猜测是,尽管它试图在 window_loaded 中添加项目,但直到 window 实际完成加载后它才完成添加。因此,当我调用从索引计数中删除项目的语法时,它会抛出该错误,因为此时列表框仍为空。那么我如何在 window 加载时添加数据,一旦完成添加数据,从批处理中删除包含语法的第一个条目或阻止它显示第一个条目。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var info = new ProcessStartInfo("extractServiceList.bat") { UseShellExecute = false, RedirectStandardOutput = true };
    var proc = new Process { StartInfo = info, EnableRaisingEvents = true };

    proc.OutputDataReceived += (obj, args) =>
    {
        if (args.Data != null)
        {
            this.Dispatcher.Invoke(() =>
            {
                listBoxServices.Items.Add(args.Data);

                //below logic for removing whitespaces from listbox view
                int count = listBoxServices.Items.Count;

                for (int i = count - 1; i >= 0; i--)
                {
                    //Condition evaluating to see if it return true for = listbox items empty and
                    //looping through each entry to remove the whitespace entry
                    if (String.IsNullOrWhiteSpace(listBoxServices.Items[i].ToString()))
                    {
                        listBoxServices.Items.RemoveAt(i);
                    }
                }
                //end of logic above for removing whitespaces from listbox view
            });

            //listBoxServices.Items.RemoveAt(listBoxServices.Items.Count - 1);
        }
    };

    proc.Start();
    proc.BeginOutputReadLine();
}

https://i.imgur.com/Sif8wky.png

也许你可以收集所有输出,先检查并添加到输出如果不是空格。然后,在 Exited 事件中添加到列表框。这是一个命令行示例,但如果您替换 Exited 事件处理程序,它应该可以在 WPF 中使用。

List<string> output = new List<string>();
proc.OutputDataReceived += (obj, args) =>
{
    if (args.Data != null)
    {
        if (String.IsNullOrWhiteSpace(args.Data))
            return;
        output.Add(args.Data);
    }
};

proc.Exited += (s, args) =>
{
    foreach (var o in output)
        Console.WriteLine(o);
}