Вашей целью является конструирование компоновки, в которой главное окно имеет расположенную в верхней части систему меню, под ней — панель инструментов и в нижней части окна — строку состояния. Строка состояния будет содержать область для текстовых подсказок, которые отображаются при выборе пользователем пункта меню (или кнопки в панели инструментов). Система меню и панель инструментов предоставят триггеры пользовательского интерфейса для закрытия приложения и отображения вариантов правописания в виджете 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">
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})
<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)