我想要一个包含开放串行端口作为项目的组合框。但是当串行端口修改时,它会自动更新。
我的方法是这样的:
-
在 Xaml 中创建一个如下所示的组合框:
<ComboBox Height="23" HorizontalAlignment="Left" Margin="87,35,0,0" Name="comboBox1" VerticalAlignment="Top" Width="147" ContextMenuOpening="comboBox1_ContextMenuOpening" />
-
创建一个循环槽端口并将其添加到 comboBox 的方法:
public string[] portsManual; public void adaugaPorturi() { if (comboBox1.Items.Count > 0) { comboBox1.Items.RemoveAt(0); } comboBox1.Items.Add("Select port"); comboBox1.SelectedItem = "Select port"; portsManual = SerialPort.GetPortNames(); foreach (string port in portsManual) { comboBox1.Items.Add(port); } comboBox1.Items.Refresh(); Array.Clear(portsManual, 0, portsManual.Length); }
-
在 window.load 调用此方法(因此它可以包含一些内容 - 然后打开的端口)并在 ContextMenuOpen 事件中调用它(每当我单击 comboBox 选择一个项目 - 一个端口,刷新)
注意:我在开始时清除了 comboBox 项目(如果有的话),字符串数组也是如此,但它没有更新,这些项目仍然是第一次运行此方法时的项目!
我试过:ObservableCollection,字符串和数组,但没有运气。我在这个网站上找到的最多信息。我在想,因为只有几个端口,所以我真的不需要集合或列表。我只是直接添加项目。
顺便说一句,管理员可以编辑这篇文章吗?我不确定文本格式是否好。
首先,您可能应该使用 MVVM 和数据绑定,而不是直接从视图的代码隐藏中查询串行端口。
其次,似乎您使用了错误的事件,如果您希望每次菜单打开时刷新它,则应使用 DropDownTOpen 事件
<ComboBox Height="23" HorizontalAlignment="Left" Margin="87,35,0,0" Name="comboBox1" VerticalAlignment="Top" Width="147" DropDownOpened="comboBox1_DropDownOpened" />
并在您的代码隐藏中尝试此操作
public void InitPorts()
{
RefreshPorts();
comboBox1.SelectedItem = "Select port";
}
public void RefreshPorts()
{
comboBox1.Items.Clear();
comboBox1.Items.Add("Select port");
foreach (var port in SerialPort.GetPortNames())
comboBox1.Items.Add(port);
}
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
InitPorts();
}
private void ComboBox1_OnDropDownOpened(object sender, EventArgs e)
{
RefreshPorts();
}