Приложение WPF для захвата ключевых событий вверх / вниз - PullRequest
9 голосов
/ 03 декабря 2010

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

Это распределенное приложение с системой чата.Эффект, который я ищу, состоит в том, что пользователь может начать вводить сообщение чата в любое время, не переключаясь на стандартное окно чата.Я покажу их сообщение в приложении, используя объекты FormattedText.Это важно, потому что это означает, что в приложении больше нет элементов ввода текста.

Моя структура XAML выглядит примерно так:

<MainWindow>
  <Canvas 1>
    <Canvas 2>
      <Image 1 />
    </Canvas 2>
    <Image 2 />
  </Canvas 1>
</MainWindow>

Я программно добавляю элементы в Canvas 2 и манипулирую имиджем2, именно поэтому он имеет такую ​​структуру.

Я пытался добавить события KeyDown, KeyUp и Preview в MainWindow и Canvas 1, но ни одно из них, похоже, не срабатывает (я проверяю с помощью точек останова).Я также, после прочтения еще одного связанного вопроса, попытался вручную установить фокус на главном окне в методе Loaded ().

Я понимаю, что на этом сайте есть много связанных вопросов, но они непомог мне, потому что:

  • ответов нет (ответ на мой вопрос?)
  • они принимают виджет ввода текста и заинтересованы в всплывающих событиях
  • они хотят связать клавиши для небольшого количества ключей - я хотел бы захватить любую клавишу
  • они заинтересованы в обнаружении, не работает ли клавиша управления / Shift / Alt после того, как они уже захватили событие

Спасибо, что нашли время, чтобы прочитать мой длинный пост, и спасибо за предложения.

Обновление (После комментария Рэйчел) Когда я вставляюTextBox и установите фокус на TextBox, сработает метод ключевого события на уровне MainWindow.Так что это работает так, как рекламируется.

Однако мне бы очень хотелось, чтобы в приложении вообще не было виджета для ввода текста.Я бы хотел, чтобы пользователь мог просто начать печатать сообщение.

Ответы [ 3 ]

7 голосов
/ 03 декабря 2010

Немного повозившись, я получил это:

XAML:

<Window x:Class="KeyInput.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="100" Width="225">
    <Canvas>
        <Grid>
            <Label Name="test" Content="Empty" />
        </Grid>
    </Canvas>
</Window>

CS:

using System.Windows;
using System.Windows.Input;

namespace KeyInput
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.KeyDown += new KeyEventHandler(OnButtonKeyDown);
        }

        private void OnButtonKeyDown(object sender, KeyEventArgs e)
        {
            test.Content = test.Content + e.Key.ToString();
        }
    }
}

Это печатает такие вещи, как "Shift", так что выочевидно, придется использовать переключатели ... но у него есть текстовое поле, которое собирает нажатия клавиш.

3 голосов
/ 03 декабря 2010

Мне удалось разобраться, вдохновившись ответами от Рэйчел и WernerCD . Как они оба продемонстрировали, захват события на уровне MainWindow работает. Проблема заключалась в том, что я не упомянул, что до загрузки MainWindow у меня был диалог, который, кажется, мешал нормальному фокусу клавиатуры в MainWindow. Ввод явного Keyboard.focus () в метод Loaded () происходит слишком рано. Я исправил проблему, поместив Keyboard.focus () в метод MainWindow_ContentRendered ().

Все теперь хорошо (так или иначе, до следующего номера). Спасибо вам за помощь.

2 голосов
/ 03 декабря 2010

Я обычно добавляю событие PreviewKeyDown в MainWindow.

Возможно, ваша проблема в том, что у вас нет элемента управления, который принимает фокус клавиатуры на вашем приложении.Получаете ли вы те же результаты, если добавляете TextBox в MainWindow и устанавливаете фокус там?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...