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

  • Для тренировки, перекройте в классе 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}" />
  • Запустите приложение - сейчас надписи на кнопках должны выглядеть так








Дата добавления: 2015-04-15; просмотров: 673;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.003 сек.