Rispondere e pulsanti “Indietro” “avanti” in WPF
-
18-09-2019 - |
Domanda
Avevo intenzione di aggiungere il supporto per i pulsanti Avanti e Indietro, trovato su molte tastiere, al mio WPF app, ma sto lottando per farli funzionare.
Ho provato con una combinazione di tasti standard per BrowserBack e BrowserForward, nessuna gioia. Ho provato il codice con il tasto ESC per assicurarsi che stava lavorando in linea di principio, e quella chiave andava bene.
Nextup ho gestito l'evento KeyUp, ma la chiave che viene inviato è "Sistema", che è inutile, e se uso KeyInterop.VirtualKeyFromKey ottengo solo 0 restituito.
sto iniziando a pensare che PInvoke / intrappolando veri messaggi di finestra stanno per essere l'unica opzione, ma io preferirei evitare che se qualcuno ha qualche idea brillante?
Oh, e le chiavi stesse sicuramente il lavoro, e la mia tastiera è collegata; -)
Aggiorna : Essi suggeriscono di utilizzare SystemKey mi ha fatto un punto che posso farlo funzionare con:
new KeyBinding(TestCommand, new KeyGesture(Key.Left, ModifierKeys.Alt));
E che sembra funzionare per il pulsante della tastiera, ma non funziona per il tocco corrispondente "flick" (che simula il prossimo e ritorno). Quei colpi di frusta funzionano bene nei browser, ma secondo la mia evento KeyUp tutti stanno inviando è "AltSinistro" e non molto altro!
** Aggiornamento ** Anche in questo caso: il commento di Rich mi ha fatto questo:
this.CommandBindings.Add(new CommandBinding(NavigationCommands.BrowseBack, BrowseBack_Executed));
this.CommandBindings.Add(new CommandBinding(NavigationCommands.BrowseForward, BrowseForward_Executed));
che sembra funzionare un piacere .. Flicks troppo!
Soluzione
I pulsanti si fa riferimento a come vengono gestiti MediaCommands, NavigationCommands, ApplicationCommands, EditingCommands o ComponentCommands in WPF - avrete bisogno di aggiungere un CommandBinding per ciascuno dei pulsanti da intercettare, ad esempio: -
<Window.CommandBindings>
<CommandBinding Command="MediaCommands.PreviousTrack"
Executed="PreviousTrackCommandBinding_Executed"/>
<CommandBinding Command="MediaCommands.NextTrack"
Executed="NextTrackCommandBinding_Executed"/>
E aggiungere eventi rilevanti in codice dietro: -
private void PreviousTrackCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("Previous track");
}
private void NextTrackCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("Next track");
}
Direi che nel tuo caso è probabilmente NavigationCommands.BrowseForward e NavigationCommands.BrowseBack. Scopri ... http://msdn.microsoft .com / it-it / library / system.windows.input.navigationcommands.aspx e http://msdn.microsoft.com/en-us/library/system.windows.input.navigationcommands_members.aspx
Guarda il mio post sul blog per maggiori informazioni e più esempi di codice.
http://richardhopton.blogspot.com/2009 /08/responding-to-mediapresentation-buttons.html
Altri suggerimenti
Nel caso in PreviewKeyUp, si dovrebbe essere in grado di fare questo -
private void Window_PreviewKeyUp(object sender, KeyEventArgs e){
if (e.SystemKey == Key.BrowserBack)
// Do something ...
Mi dispiace dirlo, ma questo ha funzionato bene per me:
<RichTextBox>
<RichTextBox.InputBindings>
<KeyBinding Key="BrowserForward" Command="Paste"/>
</RichTextBox.InputBindings>
<FlowDocument>
<Paragraph>
Some text here to cut and paste...
</Paragraph>
</FlowDocument>
</RichTextBox>
Quando si preme il tasto Avanti sulla mia tastiera lo fa una pasta.
E 'possibile qualcos'altro sta intercettando la pressione di un tasto?