File.WriteAllText(saveDlg.FileName, txtData.Text);
}
}
На заметку!
Система команд WPF более подробно рассматривается в главе 28, где будут создаваться специальные команды на основеICommand и RelayCommands.Итак, пример и начальное знакомство с элементами управления WPF завершены. Вы узнали, как работать с базовыми командами, системами меню, строками состояния, панелями инструментов, вложенными панелями и несколькими основными элементами пользовательского интерфейса (вроде TextBox
Expander). В следующем примере вы будете иметь дело с более экзотическими элементами управления, а также с рядом важных служб WPF.Понятие маршрутизируемых событий
Вы могли заметить, что в предыдущем примере кода передавался параметр RoutedEventArgs
EventArgs. Модель маршрутизируемых событий является усовершенствованием стандартной модели событий CLR и спроектирована для того, чтобы обеспечить возможность обработки событий в манере, подходящей описанию XAML дерева объектов. Предположим, что имеется новый проект приложения WPF по имени WpfRoutedEvents. Модифицируйте описание XAML начального окна, добавив следующий элемент управления Button, который определяет сложное содержимое:
Click ="btnClickMe_Clicked">
Fancy Button!
Height ="25" Width ="50" Cursor="Hand"
Canvas.Left="25" Canvas.Top="12"/>
Height = "15" Width ="36"
Canvas.Top="17" Canvas.Left="32"/>
Обратите внимание, что в открывающем определении элемента Button
Click за счет указания имени метода, который должен вызываться при возникновении события. Событие Click работает с делегатом RoutedEventHandler, который ожидает обработчик события, принимающий object в первом параметре и System.Winodws.RoutedEventArgs во втором. Реализуйте такой обработчик:public void btnClickMe_Clicked(object sender, RoutedEventArgs e)
{
// Делать что-нибудь, когда на кнопке произведен щелчок.
MessageBox.Show("Clicked the button");
}
После запуска приложения окно сообщения будет отображаться независимо от того, на какой части содержимого кнопки был выполнен щелчок (зеленый элемент Ellipse
Ellipse, элемент Label или поверхность элемента Button). В принципе это хорошо. Только представьте, насколько громоздким оказалась бы обработка событий WPF, если бы пришлось обрабатывать событие Click для каждого из упомянутых подэлементов. Дело не только в том, что создание отдельных обработчиков событий для каждого аспекта Button — трудоемкая задача, а еще и в том, что в результате получился бы сложный в сопровождении код.К счастью,
Click вне зависимости от того, на какой части кнопки был совершен щелчок. Выражаясь просто, модель маршрутизируемых событий автоматически распространяет событие вверх (или вниз) по дереву объектов в поисках подходящего обработчика.Точнее говоря, маршрутизируемое событие может использовать три
Window) вниз к точке возникновения, то его называют Роль пузырьковых маршрутизируемых событий
В текущем примере, когда пользователь щелкает на внутреннем овале желтого цвета, событие Click
Canvas), затем на StackPanel и в итоге на уровень Button, где обрабатывается. Подобным же образом, если пользователь щелкает на Label, то событие всплывает на уровень StackPanel и, в конце концов, попадает в элемент Button.Благодаря такому шаблону пузырьковых маршрутизируемых событий не придется беспокоиться о регистрации специфичных обработчиков события Click
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT