概念
在大部分Windows應用程序中,通常我們的菜單(Menu)會至於窗口頂部,但是在WPF中爲了保證較高的靈活性,實際上你可以在窗體的任意位置放置菜單控件(Menu Control),菜單控件(Menu Control)的高度和寬度也可以任由你的設定。
<Window x:Class="菜單.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:菜單"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="200">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Header="_New" />
<MenuItem Header="_Open" />
<MenuItem Header="_Save" />
<Separator />
<MenuItem Header="_Exit" />
</MenuItem>
</Menu>
<TextBox AcceptsReturn="True" Name="txtEditor" />
</DockPanel>
</Window>
一個標籤的第一個字符前有一個下劃線(_)。在WPF的Meun控件中,這樣的命名規則意味着窗體將會接收到相應的快捷鍵用於激活Meun中的子條目。這將會以從頂層依次向下展開層次的子項目的方式工作,在該例程中,如果按下Alt鍵的同時,依次按下F鍵,然後按下N鍵,那麼標籤名爲New的子條目將會被選中激活。
處理單擊
最簡單的方法是向MenuItem添加一個click事件處理程序,就像這樣:
<MenuItem Header="_New" Click="mnuNew_Click" />
但更常見的方法是使用WPF命令。在使用命令時,WPF會自動響應鍵盤快捷鍵。 菜單項的文本(Header)也會自動設置
<Window x:Class="菜單.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:菜單"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="200">
<Window.CommandBindings>
<CommandBinding Command="New" CanExecute="CommonCommandBinding_CanExecute" />
<CommandBinding Command="Open" CanExecute="CommonCommandBinding_CanExecute" />
<CommandBinding Command="Save" CanExecute="CommonCommandBinding_CanExecute" />
</Window.CommandBindings>
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Command="New" />
<Separator />
<MenuItem Header="_Exit" />
</MenuItem>
<MenuItem Header="_Edit">
<MenuItem Command="Cut" />
<MenuItem Command="Copy" />
<MenuItem Command="Paste" />
<MenuItem Command="Open" />
<MenuItem Command="Save" />
<MenuItem Command="Find" />
</MenuItem>
</Menu>
<TextBox AcceptsReturn="True" Name="txtEditor" />
</DockPanel>
</Window>
using System.Windows;
using System.Windows.Input;
namespace 菜單
{
/// <summary>
/// MainWindow.xaml 的交互邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void CommonCommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
}
}
這個示例告訴4個道理:
① wpf內置命令可以簡寫,如new,cut,save
② 簡單的事件處理CanExecute,在綁定時可以共用一個
③wpf內置命令中的paste,cut,copy,完全不需要指明綁定到textbox,它能自動實現,而new,save,open等命令必須由用戶自己實現邏輯。
④用內置命令和菜單menu結合,就算沒有實現邏輯,起碼也響應了鍵盤快捷鍵, 菜單項的文本(Header)也會根據命令描述自動設置。