【问题标题】:Show all processes on a ComboBox在 ComboBox 上显示所有进程
【发布时间】:2020-11-11 08:46:48
【问题描述】:

我想创建一个ComboBox 来显示所有正在运行的进程。

屏幕截图如下。它只是空的。

XAML:

ComboBox Name="comboBox" RenderTransformOrigin="0.502,-0.751" Margin="129,112,111,217" SelectionChanged="comboBox_SelectionChanged"/>

C#:

{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void  comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        comboBox.Items.Clear();
        Process[] MyProcess = Process.GetProcesses();
        for (int i = 1; i < MyProcess.Length; i++)
            comboBox.Items.Add(string.Format("{0} - {1}", MyProcess[i].ProcessName, MyProcess[i].Id));
    }
}

【问题讨论】:

  • 在 SelectionChanged 事件处理程序中设置项目没有意义。在 ComboBox 中有任何项目之前,它显然不会被调用。将该代码移至 MainWindow 构造函数。
  • SelectionChanged 在您从组合框中选择一个项目时触发。一开始您的组合框是空的,因此无法触发。我建议您定期获取所有进程,例如每 5 秒一次,并将它们存储在列表或更好的可观察集合中。您可以直接绑定到组合框。
  • @Clemens 如果我但在 MainWindow 中我会收到此错误:“MainWindow”不包含“comboBox_SelectionChanged”的定义,并且没有可访问的扩展方法“comboBox_SelectionChanged”接受类型的第一个参数可以找到“MainWindow”(您是否缺少 using 指令或程序集引用?)

标签: c# .net wpf xaml process


【解决方案1】:

SelectionChanged 事件不起作用,因为它仅在选择更改时触发。您可以改用DropDownOpened 事件。

ComboBox Name="comboBox" RenderTransformOrigin="0.502,-0.751" Margin="129,112,111,217" DropDownOpened="ComboBox_OnDropDownOpened"/>

您的事件处理程序如下所示:

private void ComboBox_OnDropDownOpened(object? sender, EventArgs e)
{
   comboBox.Items.Clear();
   var processes = Process.GetProcesses();
   for (var i = 1; i < processes.Length; i++)
      comboBox.Items.Add($"{processes[i].ProcessName} - {processes[i].Id}");
}

另一种方法是公开您在构造函数中初始化并绑定到 XAML 中 ComboBoxItemsSource 的进程集合。然后您可以根据需要更新集合,例如通过计时器或通过用户触发的命令定期更新。

您可以采用以下选项之一来实施该集合:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多