菜单概述
更新:2007 年 11 月
使用 Menu 类,可以按照分层顺序对与命令和事件处理程序相关联的元素进行组织。每个 Menu 元素都包含一个由 MenuItem 元素组成的集合。
本主题包括下列各节。
- Menu 控件
- 创建 Menu
- 具有键盘快捷键的 MenuItem
- Menu 样式
- 相关主题
Menu 控件
Menu 控件表示一系列用来为应用程序指定命令或选项的项。通常,单击 MenuItem 将打开一个子菜单或者导致应用程序执行相应的命令。
创建 Menu
下面的示例将创建一个 Menu 来操作 TextBox 中的文本。Menu 包含多个使用 Command、IsCheckable 和 Header 属性以及 Checked、Unchecked 和 Click 事件的 MenuItem 对象。
<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 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
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;
}
}
具有键盘快捷键的 MenuItem
键盘快捷键是可以用键盘输入以调用 Menu 命令的字符组合。例如,“复制”的快捷键是 Ctrl+C。可以将以下两个属性与键盘快捷键和菜单项结合使用:InputGestureText 和 Command。
InputGestureText
下面的示例演示如何使用 InputGestureText 属性来将键盘快捷键文本分配给 MenuItem 控件。这只是将键盘快捷键放在菜单项中, 而不会将命令与 MenuItem 相关联。应用程序必须处理用户的输入才能执行该操作。
<MenuItem Header="_Cut" InputGestureText="Ctrl+X"/>
<MenuItem Header="_Find" InputGestureText="Ctrl+F"/>
命令
下面的示例演示如何使用 Command 属性来将“打开”和“保存”命令与 MenuItem 控件相关联。该 Command 属性不但将命令与 MenuItem 相关联,而且还提供要用作快捷方式的输入笔势文本。
<MenuItem Header="_Open" Command="ApplicationCommands.Open"/>
<MenuItem Header="_Save" Command="ApplicationCommands.Save"/>
MenuItem 类还有一个 CommandTarget 属性,该属性指定要在其中执行命令的元素。如果未设置 CommandTarget,则具有键盘焦点的元素将收到命令。有关相应命令的更多信息,请参见命令概述。
Menu 样式
使用控件样式设置,可以显著改变 Menu 控件的外观和行为,而不必编写自定义控件。除了设置可视化属性外,还可以向控件的各个部分应用 Style,通过属性更改控件各个部分的行为,向控件中添加额外的部分,或者改变控件的布局。下面的示例演示了几种用来将 Style 添加到 Menu 控件中的方法。
第一个代码示例定义了一个名为 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>
下面的示例使用的是 Trigger 元素,通过这些元素,可以改变 MenuItem 的外观来响应发生在 Menu 上的事件。当您将鼠标移到 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>