メニューの概要

Menu クラスを使うと、コマンドおよびイベント ハンドラーに関連付けられている要素を階層順に整理できます。 各 Menu 要素には、MenuItem 要素のコレクションが含まれます。

Menu コントロールには、アプリケーションのコマンドまたはオプションを指定する項目の一覧が表示されます。 通常、MenuItem をクリックすると、サブメニューが開かれるか、またはアプリケーションによってコマンドが実行されます。

メニューの作成

次の例では、TextBox のテキストを操作するための Menu を作成します。 Menu に含まれる MenuItem オブジェクトでは、CommandIsCheckableHeader の各プロパティと、CheckedUncheckedClick の各イベントが使用されます。

<Menu>
  <MenuItem Header="_Edit">
    <MenuItem Command="ApplicationCommands.Copy"/>
    <MenuItem Command="ApplicationCommands.Cut"/>
    <MenuItem Command="ApplicationCommands.Paste"/>
  </MenuItem>
  <MenuItem Header="_Font">
    <MenuItem Header="_Bold" IsCheckable="True"
              Checked="Bold_Checked"
              Unchecked="Bold_Unchecked"/>
    <MenuItem Header="_Italic" IsCheckable="True"
              Checked="Italic_Checked"
              Unchecked="Italic_Unchecked"/>
    <Separator/>
    <MenuItem Header="I_ncrease Font Size"
              Click="IncreaseFont_Click"/>
    <MenuItem Header="_Decrease Font Size"
              Click="DecreaseFont_Click"/>
  </MenuItem>
</Menu>
<TextBox Name="textBox1" TextWrapping="Wrap"
         Margin="2">
  The quick brown fox jumps over the lazy dog.
</TextBox>

private void Bold_Checked(object sender, RoutedEventArgs e)
{
    textBox1.FontWeight = FontWeights.Bold;
}

private void Bold_Unchecked(object sender, RoutedEventArgs e)
{
    textBox1.FontWeight = FontWeights.Normal;
}

private void Italic_Checked(object sender, RoutedEventArgs e)
{
    textBox1.FontStyle = FontStyles.Italic;
}

private void Italic_Unchecked(object sender, RoutedEventArgs e)
{
    textBox1.FontStyle = FontStyles.Normal;
}

private void IncreaseFont_Click(object sender, RoutedEventArgs e)
{
    if (textBox1.FontSize < 18)
    {
        textBox1.FontSize += 2;
    }
}

private void DecreaseFont_Click(object sender, RoutedEventArgs e)
{
    if (textBox1.FontSize > 10)
    {
        textBox1.FontSize -= 2;
    }
}

Private Sub Bold_Checked(ByVal sender As Object, ByVal e As RoutedEventArgs)
    textBox1.FontWeight = FontWeights.Bold
End Sub

Private Sub Bold_Unchecked(ByVal sender As Object, ByVal e As RoutedEventArgs)
    textBox1.FontWeight = FontWeights.Normal
End Sub

Private Sub Italic_Checked(ByVal sender As Object, ByVal e As RoutedEventArgs)
    textBox1.FontStyle = FontStyles.Italic
End Sub

Private Sub Italic_Unchecked(ByVal sender As Object, ByVal e As RoutedEventArgs)
    textBox1.FontStyle = FontStyles.Normal
End Sub

Private Sub IncreaseFont_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If textBox1.FontSize < 18 Then
        textBox1.FontSize += 2
    End If
End Sub

Private Sub DecreaseFont_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If textBox1.FontSize > 10 Then
        textBox1.FontSize -= 2
    End If
End Sub

キーボード ショートカットは、Menu コマンドを呼び出すために、キーボードを使用して入力できる文字の組み合わせです。 たとえば、コピーのショートカットは CTRL+C です。 キーボード ショートカットとメニュー項目で使用するプロパティは、InputGestureText または Command の 2 つです。

InputGestureText

次の例では、InputGestureText プロパティを使用し、キーボード ショートカットのテキストを MenuItem コントロールに割り当てる方法を示します。 これは、キーボード ショートカットをメニュー項目に配置するだけです。 コマンドと MenuItem が関連付けられることはありません。 アプリケーションでは、アクションを実行するために、ユーザーの入力を処理する必要があります。

<MenuItem Header="_Cut" InputGestureText="Ctrl+X"/>
<MenuItem Header="_Find" InputGestureText="Ctrl+F"/>

コマンド

次の例では、Command プロパティを使用して、開くコマンドと保存コマンドを MenuItem コントロールに関連付ける方法を示します。 コマンドのプロパティでは、コマンドと MenuItem が関連付けられるだけでなく、ショートカットとして使用する入力ジェスチャのテキストも提供されます。

<MenuItem Header="_Open" Command="ApplicationCommands.Open"/>
<MenuItem Header="_Save" Command="ApplicationCommands.Save"/>

MenuItem クラスには CommandTarget プロパティもあり、このプロパティではコマンドが発生する要素を指定します。 CommandTarget が設定されていない場合は、キーボード フォーカスを持つ要素がコマンドを受信します。 コマンドの詳細については、Commanding Overviewを参照してください。

コントロールのスタイル設定では、Menu コントロールの動作と外観を大幅に変更できます。カスタム コントロールを作成する必要はありません。 ビジュアル プロパティの設定の他、Style をコントロールの各パーツに適用し、プロパティを使用してコントロールのパーツの動作を変更、パーツを追加またはコントロールのレイアウトを変更できます。 次の例では、StyleMenu コントロールに追加するいくつかの方法を示します。

最初のコード例は、スタイルの現在のシステム設定を使用する方法を示す Simple という名前の Style を定義します。 このコードは、MenuHighlightBrushの色をメニューの背景色として、 MenuTextBrushの色をメニューの前景色として割り当てます。 ブラシを割り当てるには、リソース キーを使用することに注意してください。

<Style x:Key="Simple" TargetType="{x:Type MenuItem}">
  <Setter Property = "Background" Value= "{DynamicResource {x:Static SystemColors.MenuHighlightBrushKey}}"/>
  <Setter Property = "Foreground" Value= "{DynamicResource {x:Static SystemColors.MenuTextBrushKey}}"/>
  <Setter Property = "Height" Value= "{DynamicResource {x:Static SystemParameters.CaptionHeightKey}}"/>
</Style>

次のサンプルでは、Menu で発生したイベントに応じて MenuItem の外観を変更できる Trigger 要素が使用されています。 Menu をポイントすると、メニュー項目の前景色およびフォント文字が変更されます。

<Style x:Key="Triggers" TargetType="{x:Type MenuItem}">
  <Style.Triggers>
    <Trigger Property="MenuItem.IsMouseOver" Value="true">
      <Setter Property = "Foreground" Value="Red"/>
      <Setter Property = "FontSize" Value="16"/>
      <Setter Property = "FontStyle" Value="Italic"/>
    </Trigger>
  </Style.Triggers>
</Style>

関連項目