Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
В дополнение к обработке события Click для каждого подэлемента необходимо также обработать события MouseEnter и MouseExit, которые применяются для установки текста в строке состояния. Добавьте в контекст элемента DockPanel следующую разметку:
<!-- Стыковать систему меню к верхней части —>
<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)
{
// Закрыть это окно.
this.Close();
}
protected void ToolsSpellingHints_Click(object sender, RoutedEventArgs args)
{
}
protected void MouseEnterExitArea(object sender, RoutedEventArgs args)
{
}
protected void MouseEnterToolsHintsArea(object sender, RoutedEventArgs args)
{
}
protected void MouseLeaveArea(object sender, RoutedEventArgs args)
{
}
}
Визуальное построение меню
Наряду с тем, что всегда полезно знать, как вручную определять элементы в XAML, такая работа может быть слегка утомительной. В Visual Studio поддерживается возможность визуального конструирования систем меню, панелей инструментов, строк состояния и многих других элементов управления пользовательского интерфейса. Щелчок правой кнопкой мыши на элементе управления Menu приводит к открытию контекстного меню, содержащего Add MenuItem (Добавить MenuItem), который позволяет добавить новый пункт меню в элемент управления Menu. После добавления набора пунктов верхнего уровня можно заняться добавлением пунктов подменю, разделителей, развертыванием и свертыванием самого меню и выполнением других связанных с меню операций посредством второго щелчка правой кнопкой мыши.
В оставшейся части примера MyWordPad вы увидите финальную сгенерированную разметку XAML; тем не менее, посвятите некоторое время экспериментированию с визуальными конструкторами.
Построение панели инструментов
Панели инструментов (представляемые в WPF классом ToolBar) обычно предлагают альтернативный способ активизации пунктов меню. Поместите следующую разметку непосредственно после закрывающего дескриптора определения Menu:
<!-- Поместить панель инструментов под областью меню -->
<ToolBar DockPanel.Dock ="Top" >
<Button Content ="Exit" MouseEnter ="MouseEnterExitArea"
MouseLeave ="MouseLeaveArea" Click ="FileExit_Click"/>
<Separator/>
<Button Content ="Check" MouseEnter ="MouseEnterToolsHintsArea"
MouseLeave ="MouseLeaveArea" Click ="ToolsSpellingHints_Click"
Cursor="Help" />
</ToolBar>
Ваш элемент управления ToolBar образован из двух элементов управления Button, которые предназначены для обработки тех же самых событий теми же методами из файла кода. С помощью такого приема можно дублировать обработчики для обслуживания и пунктов меню, и кнопок панели инструментов. Хотя в данной панели применяются типичные нажимаемые кнопки, вы должны принимать во внимание, что тип ToolBar "является" ContentControl, а потому на его поверхность можно помещать любые типы (скажем, раскрывающиеся списки, изображения и графику). Еще один интересный аспект связан с тем, что кнопка Check (Проверить) поддерживает специальный курсор мыши через свойство Cursor.
На заметку! Элемент Toolbar может быть дополнительно помещен внутрь элемента ToolBarTray, который управляет компоновкой, стыковкой и перетаскиванием для набора объектов ToolBar.
Построение строки состояния
Элемент управления строкой состояния (StatusBar) стыкуется с нижней частью DockPanel и содержит единственный элемент управления TextBlock, который ранее в главе не использовался. Элемент TextBlock можно применять для хранения текста с форматированием вроде выделения полужирным и подчеркивания, добавления разрывов строк и т.д. Поместите приведенную ниже разметку сразу после предыдущего определения элемента управления ToolBar:
<!-- Разместить строку состояния внизу -->
<StatusBar DockPanel.Dock ="Bottom" Background="Beige" >
<StatusBarItem>
<TextBlock Name="statBarText" Text="Ready"/>
</StatusBarItem>
</StatusBar>
Завершение проектирования пользовательского интерфейса
Финальный аспект проектирования нашего пользовательского интерфейса связан с определением поддерживающего разделители элемента Grid, в котором определены две колонки. Слева находится элемент управления Expander, помещенный внутрь StackPanel, который будет отображать список предполагаемых вариантов правописания, а справа — элемент TextBox с поддержкой многострочного текста, линеек прокрутки и включенной проверкой орфографии. Элемент Grid может быть целиком размещен в левой части родительской панели DockPanel. Чтобы завершить определение пользовательского интерфейса окна, добавьте следующую разметку XAML, расположив ее непосредственно под разметкой, которая описывает StatusBar:
<Grid DockPanel.Dock ="Left" Background ="AliceBlue">
<!-- Определить строки и колонки