使用WPF菜单项中的文本

时间:2013-06-05 04:53:38

标签: c# wpf menu serial-port

我有一个菜单,列出了计算机上当前可用的COM端口。我想要的是获取菜单项的文本。即如果我选择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>

然后获取com端口的代码:

string[] ports = SerialPort.GetPortNames();

以及将其添加到菜单中的代码:

Menu_Port.ItemsSource = ports;

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

1 个答案:

答案 0 :(得分:1)

您需要为每个端口创建string,并为该项目注册click事件,然后将其添加到主菜单,而不是在菜单中添加MenuItem列表。将您的代码更改为:

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);
}

然后添加一个事件处理程序方法以从菜单项(即端口)获取文本:

private void Menu_Port_Click(object sender, RoutedEventArgs e)
{
   string selectedPort = ((MenuItem)sender).Header.ToString();

   // Alternatively, if you want to maintain a list of selected ports, you can do something like this:
   MenuItem selectedMenu = ((MenuItem)sender);

   if (selectedMenu.IsChecked)
   {
      // In this case "allSelectedPorts" is a global string list.
      allSelectedPorts.Add(selectedMenu.Header.ToString());
   }
   else
   {
      allSelectedPorts.Remove(selectedMenu.Header.ToString());
   }
}

修改

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

 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;
     }
 }