English 中文(简体)
Responding to "Back" and "Forward" buttons in WPF
原标题:

I was planning to add support for the Back and Forward buttons, found on many keyboards, to my WPF app, but I m struggling to get them to work.

I ve tried using a standard KeyBinding to BrowserBack and BrowserForward, no joy. I tested the code with the ESC key to make sure it was working in principal, and that key was fine.

Nextup I handled the KeyUp event, but the key that gets sent is "System", which is useless, and if I use KeyInterop.VirtualKeyFromKey I just get 0 returned.

I m starting to think that PInvoke/trapping real Window Messages are going to be the only option, but I d rather avoid that if anyone has any bright ideas?

Oh, and the keys themselves definately work, and my keyboard is plugged in ;-)

Update: They suggest to use SystemKey got me to a point that I can get it working with:

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

And that seems to work for the keyboard button, but it doesn t work for the corresponding touch "flick" (which simulates next and back). Those flicks work fine in the browsers, but according to my KeyUp event all they re sending is "LeftAlt" and not much else!

** Update Again ** : Rich s comment got me to this:

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

Which seems to work a treat.. flicks too!

最佳回答

The buttons you refer to are handled as MediaCommands, NavigationCommands, ApplicationCommands, EditingCommands or ComponentCommands in WPF - you ll need to add a CommandBinding for each of the buttons you want to intercept, for example:-

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

And add relevant events in code behind:-

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

I would say in your case it s probably NavigationCommands.BrowseForward and NavigationCommands.BrowseBack. Check out... http://msdn.microsoft.com/en-us/library/system.windows.input.navigationcommands.aspx and http://msdn.microsoft.com/en-us/library/system.windows.input.navigationcommands_members.aspx

Check out my blog post for more info and more code samples.

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

问题回答

In PreviewKeyUp event, you should be able to do this -

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

I hate to say it but this worked fine for me:

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

When I press the Forward key on my keyboard it does a paste.

Is it possible something else is intercepting the key press?





相关问题
WPF convert 2d mouse click into 3d space

I have several geometry meshes in my Viewport3D, these have bounds of (w:1800, h:500, d:25). When a user clicks in the middle of the mesh, I want the Point3D of (900, 500, 25)... How can I achieve ...

Editing a xaml icons or images

Is it possible to edit a xaml icons or images in the expression design or using other tools? Is it possible to import a xaml images (that e.g you have exported) in the expression designer for editing?...

WPF: writing smoke tests using ViewModels

I am considering to write smoke tests for our WPF application. The question that I am faced is: should we use UI automation( or some other technology that creates a UI script), or is it good enough to ...

WPF - MVVM - NHibernate Validation

Im facing a bit of an issue when trying to validate a decimal property on domain object which is bound to a textbox on the view through the viewmodel. I am using NHibernate to decorate my property on ...

How do WPF Markup Extensions raise compile errors?

Certain markup extensions raise compile errors. For example StaticExtension (x:Static) raises a compile error if the referenced class cannot be found. Anyone know the mechanism for this? Is it baked ...

WPF design-time context menu

I am trying to create a custom wpf control, I m wondering how I can add some design-time features. I ve googled and can t seem to get to my goal. So here s my simple question, how can I add an entry ...

How to combine DataTrigger and EventTrigger?

NOTE I have asked the related question (with an accepted answer): How to combine DataTrigger and Trigger? I think I need to combine an EventTrigger and a DataTrigger to achieve what I m after: when ...

热门标签