Чтобы завершить текущий пример, вы добавите функциональность сохранения текстовых данных во внешнем файле и открытия файлов *.txt
для редактирования. Можно пойти длинным путем, вручную добавив программную логику, которая включает и отключает пункты меню в зависимости от того, имеются ли данные внутри TextBox
. Тем не менее, для сокращения усилий можно прибегнуть к услугам команд.
Начните с обновления элемента MenuItem
, который представляет меню File верхнего уровня, путем добавления двух новых подменю, использующих объекты Save
и Open
класса ApplicationCommands
:
MouseEnter ="MouseEnterExitArea"
MouseLeave ="MouseLeaveArea" Click ="FileExit_Click"/>
Вспомните, что все объекты команд реализуют интерфейс ICommand
, в котором определены два события (CanExecute
и Executed
). Теперь необходимо разрешить окну выполнять указанные команды, предварительно проверив возможность делать это в текущих обстоятельствах; раз так, можете определить обработчик события для запуска специального кода.
Понадобится наполнить коллекцию CommandBindings
, поддерживаемую окном. В разметке XAML потребуется применить синтаксис "свойство-элемент" для определения области Window.CommandBindings
, в которую помещаются два определения CommandBinding
. Модифицируйте определение Window
, как показано ниже:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MySpellChecker" Height="331" Width="508"
WindowStartupLocation ="CenterScreen" >
Executed="OpenCmdExecuted"
CanExecute="OpenCmdCanExecute"/>
Executed="SaveCmdExecuted"
CanExecute="SaveCmdCanExecute"/>
...
Щелкните правой кнопкой мыши на каждом из атрибутов Executed
и CanExecute
в редакторе XAML и выберите в контекстном меню пункт Navigate to Event Handler (Перейти к обработчику события). Как объяснялось в главе 24, в результате автоматически сгенерируется заготовка кода для обработчика события. Теперь в файле кода C# для окна должны присутствовать четыре пустых обработчика событий.
Реализация обработчиков события CanExecute
будет сообщать окну, что можно инициировать соответствующие события Executed
в любой момент, для чего свойство CanExecute
входного объекта CanExecuteRoutedEventArgs
устанавливается в true
:
private void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
private void SaveCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
Обработчики соответствующего события Executed
выполняют действительную работу по отображению диалоговых окон открытия и сохранения файла; они также отправляют данные из TextBox
в файл. Начните с импортирования пространств имен System.IO
и Microsoft.Win32
в файл кода. Окончательный код прямолинеен:
private void OpenCmdExecuted(object sender, ExecutedRoutedEventArgs e)
{
// Создать диалоговое окно открытия файла и показать
// в нем только текстовые файлы.
var openDlg = new OpenFileDialog { Filter = "Text Files |*.txt"};
// Был ли совершен щелчок на кнопке ОК?
if (true == openDlg.ShowDialog)
{
// Загрузить содержимое выбранного файла.
string dataFromFile = File.ReadAllText(openDlg.FileName);
// Отобразить строку в TextBox.
txtData.Text = dataFromFile;
}
}
private void SaveCmdExecuted(object sender, ExecutedRoutedEventArgs e)
{
var saveDlg = new SaveFileDialog { Filter = "Text Files |*.txt"};
// Был ли совершен щелчок на кнопке ОК?
if (true == saveDlg.ShowDialog)
{
// Сохранить данные из TextBox в указанном файле.
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT