Язык программирования C#9 и платформа .NET5
CanExecute="OpenCmdCanExecute"/><CommandBinding Command="ApplicationCommands.Save"Executed="SaveCmdExecuted"CanExecute="SaveCmdCanExecute"/></Window.CommandBindings><!-- Эта панель устанавливает содержимое окна --><DockPanel>...</DockPanel></Window>Щелкните правой кнопкой мыши на каждом из атрибутов
иExecutedв редакторе XAML и выберите в контекстном меню пункт Navigate to Event Handler (Перейти к обработчику события). Как объяснялось в главе 24, в результате автоматически сгенерируется заготовка кода для обработчика события. Теперь в файле кода C# для окна должны присутствовать четыре пустых обработчика событий.CanExecuteРеализация обработчиков события
будет сообщать окну, что можно инициировать соответствующие событияCanExecuteв любой момент, для чего свойствоExecutedвходного объектаCanExecuteустанавливается вCanExecuteRoutedEventArgs:trueprivate void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e){e.CanExecute = true;}private void SaveCmdCanExecute(object sender, CanExecuteRoutedEventArgs e){e.CanExecute = true;}Обработчики соответствующего события
выполняют действительную работу по отображению диалоговых окон открытия и сохранения файла; они также отправляют данные изExecutedв файл. Начните с импортирования пространств именTextBoxиSystem.IOв файл кода. Окончательный код прямолинеен:Microsoft.Win32private 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 в указанном файле.File.WriteAllText(saveDlg.FileName, txtData.Text);}}На заметку! Система команд WPF более подробно рассматривается в главе 28, где будут создаваться специальные команды на основе
иICommand.RelayCommandsИтак, пример и начальное знакомство с элементами управления WPF завершены. Вы узнали, как работать с базовыми командами, системами меню, строками состояния, панелями инструментов, вложенными панелями и несколькими основными элементами пользовательского интерфейса (вроде
иTextBox). В следующем примере вы будете иметь дело с более экзотическими элементами управления, а также с рядом важных служб WPF.ExpanderПонятие маршрутизируемых событий
Вы могли заметить, что в предыдущем примере кода передавался параметр
, а неRoutedEventArgs. Модель маршрутизируемых событий является усовершенствованием стандартной модели событий CLR и спроектирована для того, чтобы обеспечить возможность обработки событий в манере, подходящей описанию XAML дерева объектов. Предположим, что имеется новый проект приложения WPF по имениEventArgs. Модифицируйте описание XAML начального окна, добавив следующий элемент управленияWpfRoutedEvents, который определяет сложное содержимое:Button<Window ...<Grid><Button Name="btnClickMe" Height="75" Width = "250"Click ="btnClickMe_Clicked"><StackPanel Orientation ="Horizontal"><Label Height="50" FontSize ="20">Fancy Button!</Label><Canvas Height ="50" Width ="100" ><Ellipse Name = "outerEllipse" Fill ="Green"Height ="25" Width ="50" Cursor="Hand"