Вашей целью является конструирование компоновки, в которой главное окно имеет расположенную в верхней части систему меню, под ней — панель инструментов и в нижней части окна — строку состояния. Строка состояния будет содержать область для текстовых подсказок, которые отображаются при выборе пользователем пункта меню (или кнопки в панели инструментов). Система меню и панель инструментов предоставят триггеры пользовательского интерфейса для закрытия приложения и отображения вариантов правописания в виджете
Expander
.
На рис. 25.14 показана начальная компоновка; она также иллюстрирует возможности правописания в рамках инфраструктуры WPF.
Чтобы приступить к построению интересующего пользовательского интерфейса, модифицируйте начальное определение XAML типа
Window
для использования дочернего элемента
DockPanel
вместо стандартного элемента управления
Grid
:
<Window x:Class="MyWordPad.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:local="clr-namespace:MyWordPad"
mc:Ignorable="d"
Title="My Spell Checker" Height="450" Width="800">
<! -- Эта панель устанавливает содержимое окна -->
<DockPanel>
</DockPanel>
</Window>
Построение системы меню
Системы меню в WPF представлены классом Menu, который поддерживает коллекцию объектов
MenuItem
. При построении системы меню в XAML каждый объект
MenuItem
можно заставить обрабатывать разнообразные события, наиболее примечательным из которых является
Click
, возникающее при выборе подэлемента конечным пользователем. В рассматриваемом примере создаются два пункта меню верхнего уровня (
File (Файл) и
Tools (Сервис); позже будет построено меню
Edit (Правка)), которые содержат в себе подэлементы
Exit (Выход) и
Spelling Hints (Подсказки по правописанию) соответственно.
В дополнение к обработке события
Click
для каждого подэлемента необходимо также обработать события
MouseEnter
и
MouseExit
, которые применяются для установки текста в строке состояния. Добавьте в контекст элемента
DockPanel
следующую разметку:
<b><!-- Стыковать систему меню к верхней части —></b>
<Menu DockPanel.Dock ="Top"
HorizontalAlignment="Left" Background="White" BorderBrush ="Black">
<MenuItem Header="_File">
<Separator/>
<MenuItem Header ="_Exit" MouseEnter ="MouseEnterExitArea"
MouseLeave ="MouseLeaveArea" Click ="FileExit_Click"/>
</MenuItem>
<MenuItem Header="_Tools">
<MenuItem Header ="_Spelling Hints"
MouseEnter ="MouseEnterToolsHintsArea"
MouseLeave ="MouseLeaveArea" Click ="ToolsSpellingHints_Click"/>
</MenuItem>
</Menu>
Обратите внимание, что система меню стыкована с верхней частью
DockPanel
. Кроме того, элемент
Separator
применяется для добавления в систему меню тонкой горизонтальной линии прямо перед пунктом
Exit
. Значения
Header
для каждого
MenuItem
содержат символ подчеркивания (например,
_Exit
). Подобным образом указывается символ, который будет подчеркиваться, когда конечный пользователь нажмет клавишу <
Alt> (для ввода клавиатурного сокращения). Символ подчеркивания используется вместо символа
&
в Windows Forms, т.к. язык XAML основан на XML, а символ
&
в XML имеет особый смысл.
После построения системы меню необходимо реализовать различные обработчики событий. Прежде всего, есть обработчик пункта меню File► Exit (Файл►Выход),
FileExit_Click()
, который просто закрывает окно, что в свою очередь приводит к завершению приложения, поскольку это окно самого высшего уровня. Обработчики событий
MouseEnter
и
MouseExit
для каждого подэлемента будут в итоге обновлять строку состояния; однако пока просто оставьте их пустыми. Наконец, обработчик
ToolsSpellingHints_Click()
для пункта меню
Tools►
Spelling Hints также оставьте пока пустым. Ниже показаны текущие обновления файла отделенного кода (в том числе обновленные операторы
using
):
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Microsoft.Win32;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
protected void FileExit_Click(object sender, RoutedEventArgs args)