0

コンピューターで現在使用可能な 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;

メニューを正しく実行します。データを取得するだけです。私がなんとかしたのは、リストの最初の項目を取得することだけです。

4

1 に答える 1

1

のリストをメニューに追加する代わりに、ポートごとstringに を作成し、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());
   }
}

編集

一度に 1 つのメニュー項目だけを選択したい場合は、次のようにすることができます。

 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;
     }
 }
于 2013-06-05T05:27:36.600 に答える