C# 使用WPF菜单项中的文本

C# 使用WPF菜单项中的文本,c#,wpf,menu,serial-port,C#,Wpf,Menu,Serial Port,我有一个菜单,其中列出了计算机上当前可用的com端口。我想要的是获取菜单项的文本。i、 e.如果我选择COM7,它将COM7存储到一个字符串中。以下是菜单的XAML代码: <MenuItem x:Name="Menu_Port" Header="Port"> <MenuItem.ItemContainerStyle> <Style TargetType="{x:Type MenuItem}"> <Sette

我有一个菜单,其中列出了计算机上当前可用的com端口。我想要的是获取菜单项的文本。i、 e.如果我选择
COM7
,它将
COM7
存储到一个字符串中。以下是菜单的
XAML
代码:

<MenuItem x:Name="Menu_Port" Header="Port">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="IsCheckable" Value="True" />
            <Setter Property="StaysOpenOnClick" Value="True" />
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>
Menu_Port.ItemsSource = ports;
以及将其添加到菜单的代码:

<MenuItem x:Name="Menu_Port" Header="Port">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="IsCheckable" Value="True" />
            <Setter Property="StaysOpenOnClick" Value="True" />
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>
Menu_Port.ItemsSource = ports;

它正确地显示了菜单,我只需要获取数据。我所要做的就是获取列表中的第一项。

您需要为每个端口创建一个
菜单项,并为该项注册一个单击事件,然后将其添加到主菜单,而不是将
字符串列表添加到菜单中。将代码更改为:

string[] ports = SerialPort.GetPortNames();

foreach (string port in ports)
{
   MenuItem menuItem = new MenuItem { Header = port };
   menuItem.Click += new RoutedEventHandler(Menu_Port_Click);

   Menu_Port.Items.Add(menuItem);
}
然后添加事件处理程序方法以从菜单项(即端口)获取文本:

编辑

如果一次只想选择一个菜单项,可以执行以下操作:

 string selectedPort = string.Empty;

 private void Menu_Port_Click(object sender, RoutedEventArgs e)
 {
     MenuItem selectedMenu = ((MenuItem)sender);

     Menu_Port.Items.Cast<MenuItem>().Where(
       menu => menu != selectedMenu).ToList().ForEach(item => item.IsChecked = false);

     if (selectedMenu.IsChecked)
     {
        selectedPort = selectedMenu.Header.ToString();
     }
     else
     {
        selectedPort = string.Empty;
     }
 }
string selectedPort=string.Empty;
私有无效菜单\u端口\u单击(对象发送方,路由目标)
{
MenuItem selectedMenu=((MenuItem)发件人);
菜单\u Port.Items.Cast()。其中(
menu=>menu!=selectedMenu.ToList().ForEach(item=>item.IsChecked=false);
如果(已选择菜单已选中)
{
selectedPort=selectedMenu.Header.ToString();
}
其他的
{
selectedPort=string.Empty;
}
}

感谢您的帮助,我已尝试将其放入,但您的代码中的这一行出现错误:(MenuItem)menu.Items.Cast().Single(x=>x.Name==“menu-Port”);上面说菜单(在第一个菜单项之后)在这个上下文中是不存在的。哦,对不起,我完全忽略了这一点。这是
MenuItem
所在的
ContextMenu
。给它起个名字吧。@NickFalconer更新了我的答案。再来一次,谢谢,成功了。还有一个问题。当选择另一个选项时,取消选择上一个选项的最简单方法是什么。i、 e.如果我选择COM8,它会检查它,如果我选择COM3,我希望它检查那个,然后取消选中COM8。Thanks@NickFalconer查看我的更新。这将使您一次只能选择一个菜单。