Вы должны обрабатывать PreviewKeyDown
событие вашей формы. Затем проверьте, хотите ли вы обработать событие, и если да, установите Handled
свойство события true
после того, как вы это сделаете.
Это вероятно, будет выглядеть примерно так:
public MainWindow()
{
InitializeComponent();
PreviewKeyDown += new KeyEventHandler(MainWindow_PreviewKeyDown);
}
void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Space)
{
Log("Intercepted space in preview");
e.Handled = true;
}
}
Почему вам нужно установить Handled
в true
? События в WPF запускаются на нескольких элементах пользовательского интерфейса, что зависит от его стратегии «» ». Когда ваш обработчик событий устанавливает Handled
в true
, видимость этого события будет ограничена другими элементами пользовательского интерфейса. Вскоре это не будет срабатывать в других элементах пользовательского интерфейса. Чтобы узнать больше о деталях решения выше, прочитайте остальную часть ответа ниже.
Есть некоторые вещи, которые вам необходимо понять, если вы хотите правильно использовать события в WPF. События присоединяются к элементам пользовательского интерфейса (текстовые поля, кнопки и т. Д.), А обработчики событий могут быть подключены к этим элементам пользовательского интерфейса. Кроме того, элементы пользовательского интерфейса организованы в древовидную структуру. Каждый элемент имеет свой родительский элемент, вплоть до корневого элемента пользовательского интерфейса. Как уже упоминалось, события срабатывают по нескольким элементам в зависимости от их стратегии маршрутизации ". Несколько элементов здесь означают элемент, на который нацелено событие, и его родители, вплоть до корневого элемента. Событие стратегии маршрутизации может быть следующим:
- Пузырящегося: Событие сначала выпустило для целевого события элемента. Затем он запускается для родителя, потом родителя его родительского элемента и так далее до корневого элемента (часто это окно).
- Туннелирование: Событие сначала запускается для элемента корневого пользовательского интерфейса, а затем вниз по дереву элементов пользовательского интерфейса , вдоль маршрута к целевому элементу.
- Direct: Событие запускается только для элемента цели.
Как это связано с Handled
собственности? Когда событие использует технологию барботирования или туннелирования маршрутизации, свойство Handled
используется для прекращения распространения события вниз или вверх по дереву элементов пользовательского интерфейса.
Теперь почему не KeyDown
прекращение события, распространяющегося, если вы отметили его как Handled
? Потому что событие KeyDown
использует пузырьковую стратегию. Это означает, что текстовое поле уже обрабатывает событие KeyDown, прежде чем оно будет обработано в Window обработчике, где вы устанавливаете Handled
в true
.
По этой причине вы должны использовать PreviewKeyDown
, который использует стратегию туннелирования. Ваш обработчик окна проверяет событие, помечает его как Handled
, если необходимо. Если он отмечен как Handled
, он не будет запущен вниз по дереву пользовательского интерфейса для целевой цели.
Вы можете просмотреть это как соглашение в .NET framework. PreviewX
- это события, которые используют стратегию туннелирования и являются аналогами X
событий, которые используют стратегию bubbling
.
To learn more about Routed Events visit this MSDN page. Вы найдете MSDN - хороший источник информации о WPF.
показать нам, что вы пытались – Fredrik
добавили код обработчика событий. – Emrys90
Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –