Отвечая на кнопки «Назад» и «Вперед» в WPF - PullRequest
4 голосов
/ 05 февраля 2010

Я планировал добавить поддержку кнопок «Назад» и «Вперед», которые есть на многих клавиатурах, в мое приложение WPF, но я изо всех сил стараюсь заставить их работать.

Я пытался использовать стандартную привязку клавиш к BrowserBack и BrowserForward, без радости. Я протестировал код с ключом ESC, чтобы убедиться, что он работает в принципе, и этот ключ был в порядке.

Далее я обработал событие KeyUp, но отправляемым ключом является «System», который бесполезен, и если я использую KeyInterop.VirtualKeyFromKey, я просто верну 0.

Я начинаю думать, что PInvoke / перехватывание реальных оконных сообщений будет единственным вариантом, но я бы предпочел этого, если у кого-то есть какие-нибудь яркие идеи?

О, и сами клавиши определенно работают, и моя клавиатура подключена; -)

Обновление : они предлагают использовать SystemKey, и я понял, что с ним можно работать:

new KeyBinding(TestCommand, new KeyGesture(Key.Left, ModifierKeys.Alt));

И это, кажется, работает для кнопки клавиатуры, но она не работает для соответствующего касания "щелчка" (который имитирует следующий и назад). Эти клики отлично работают в браузерах, но согласно моему событию KeyUp все, что они отправляют, это "LeftAlt" и ничего больше!

** Обновление снова **: комментарий Рича привел меня к этому:

this.CommandBindings.Add(new CommandBinding(NavigationCommands.BrowseBack, BrowseBack_Executed));
this.CommandBindings.Add(new CommandBinding(NavigationCommands.BrowseForward, BrowseForward_Executed));

Который, кажется, работает удовольствие ... щелкает тоже!

Ответы [ 3 ]

5 голосов
/ 05 февраля 2010

Кнопки, на которые вы ссылаетесь, обрабатываются как MediaCommands, NavigationCommands, ApplicationCommands, EditingCommands или ComponentCommands в WPF - вам нужно добавить CommandBinding для каждой из кнопок, которые вы хотите перехватить, например:

<Window.CommandBindings>
<CommandBinding Command="MediaCommands.PreviousTrack" 
                Executed="PreviousTrackCommandBinding_Executed"/>
<CommandBinding Command="MediaCommands.NextTrack"             
                Executed="NextTrackCommandBinding_Executed"/>

И добавить соответствующие события в коде: -

private void PreviousTrackCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("Previous track");
}
private void NextTrackCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("Next track");
}

Я бы сказал, что в вашем случае это, вероятно, NavigationCommands.BrowseForward и NavigationCommands.BrowseBack. Проверьте ... http://msdn.microsoft.com/en-us/library/system.windows.input.navigationcommands.aspx и http://msdn.microsoft.com/en-us/library/system.windows.input.navigationcommands_members.aspx

Посетите мой блог для получения дополнительной информации и примеров кода.

http://richardhopton.blogspot.com/2009/08/responding-to-mediapresentation-buttons.html

1 голос
/ 05 февраля 2010

Мне неприятно это говорить, но у меня все получилось:

<RichTextBox>   
       <RichTextBox.InputBindings>
           <KeyBinding Key="BrowserForward" Command="Paste"/>
       </RichTextBox.InputBindings>
       <FlowDocument>
            <Paragraph>
                Some text here to cut and paste...
                            </Paragraph>
            </FlowDocument>
        </RichTextBox>

Когда я нажимаю клавишу "Вперед" на клавиатуре, она вставляет.

Возможно ли, что-то ещеперехватить нажатие клавиши?

1 голос
/ 05 февраля 2010

В событии PreviewKeyUp вы должны быть в состоянии сделать это -

private void Window_PreviewKeyUp(object sender, KeyEventArgs e){
  if (e.SystemKey == Key.BrowserBack)
    // Do something ...
...