Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Перекрытие функций диспетчеризации событий






  • Для тренировки, перекройте в классе Window1 функцию диспетчеризации OnKeyDown() клавиатурного события KeyDown. Код начните вводить с ключевого слова override, чтобы воспользоваться услугами подсказчика кода IntelliSense
  • Заполните созданную оболочкой заготовку кодом, обеспечивающим закрытие окна приложения по нажатию клавиши Esc
// Выход по клавише Esc с предупреждением protected override void OnKeyDown(KeyEventArgs e) { switch (e.Key) { case Key.Escape: MessageBoxResult result = MessageBox.Show(" Закрыть приложение? ", " ", MessageBoxButton.OKCancel, MessageBoxImage.Question); if (result == MessageBoxResult.OK) this.Close(); break; } }
  • Запустите приложение, раскройте мышью меню File и нажимайте на клавишу Esc

Мы видим, что клавиша Esc действует только на те элементы, которым на момент нажатия передан фокус ввода. Но если бы мы перекрыли функцию OnPreviewKeyDown(), то окно приложения закрывалось бы сразу. Для проверки этого можно в коде просто поменять имя перекрытой функции с OnKeyDown на OnPreviewKeyDown, так как обе функции имеют одинаковую сигнатуру.

Для сравнения можно привести код использования равнозначного по функциональности класса диалогового окна из библиотеки System.Windows.Forms.dll

protected override void OnKeyDown(KeyEventArgs e) { switch (e.Key) { case Key.Escape: System.Windows.Forms.DialogResult result = System.Windows.Forms.MessageBox.Show(" Закрыть приложение? ", " ", System.Windows.Forms.MessageBoxButtons.OKCancel, System.Windows.Forms.MessageBoxIcon.Question); if (result == System.Windows.Forms.DialogResult.OK) this.Close(); break; } }

Коды немного различаются, причем последний работает похуже - после его закрытия окно WPF теряет фокус ввода. Но мы немного отвлеклись от темы команд WPF, продолжим...

Названия кнопок в разметке мы жестко подписали, но существует другой способ, когда подпись можно извлечь из самой команды (если она есть). Если объект команды произведен от класса RoutedCommand, то там нет свойства Text, которое можно было бы использовать. Но если команда имеет тип RoutedUICommand, то этот класс добавляет такое свойство и оно может иметь значение.

  • Перепишите элементы кнопок в разметке файла Window1.xaml следующим образом
< Button Margin=" 5" Padding=" 5" Focusable=" False" Command=" ApplicationCommands.Open" Content=" {x: Static ApplicationCommands.Open}" /> < Button Margin=" 5" Padding=" 5" Focusable=" False" Command=" ApplicationCommands.Save" Content=" {Binding RelativeSource={RelativeSource Self}, Path=Command.Text}" />
  • Запустите приложение - сейчас надписи на кнопках должны выглядеть так






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.