Nella mia applicazione WPF, vorrei allegare un gesto di input a un comando in modo che il gesto di input sia globalmente disponibile nella finestra principale, indipendentemente dal controllo su cui si trova il focus.WPF: Come impedire a un controllo di rubare un gesto chiave?
Nel mio caso, desidero associare Key.PageDown
a un comando, tuttavia, non appena determinati controlli ricevono lo stato attivo (ad esempio un controllo TextBox o TreeView), questi controlli ricevono gli eventi chiave e il comando non viene più attivato. Questi controlli non hanno uno specifico CommandBindings
o InputBindings
definito.
Questo è come mi definisco il mio gesto di ingresso:
XAML:
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" >
<StackPanel>
<TreeView>
<TreeViewItem Header="1">
<TreeViewItem Header="1.1"></TreeViewItem>
<TreeViewItem Header="1.2"></TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="2" ></TreeViewItem>
</TreeView>
<TextBox />
<Label Name="label1" />
</StackPanel>
</Window>
Codice:
using System;
using System.Windows;
using System.Windows.Input;
public static class Commands
{
private static RoutedUICommand _myCommand;
static Commands()
{
_myCommand = new RoutedUICommand("My Command",
"My Command",
typeof(Commands),
new InputGestureCollection()
{
new KeyGesture(Key.PageDown, ModifierKeys.None)
});
}
public static ICommand MyCommand
{
get { return _myCommand; }
}
}
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
CommandBinding cb = new CommandBinding();
cb.Command = Commands.MyCommand;
cb.Executed += new ExecutedRoutedEventHandler(cb_Executed);
cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);
this.CommandBindings.Add(cb);
}
void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
void cb_Executed(object sender, ExecutedRoutedEventArgs e)
{
this.label1.Content = string.Format("My Command was executed {0}", DateTime.Now);
}
}
Ho già provato la cattura evento della finestra PreviewKeyDown
e la marcatura come gestito questo ha avuto non l'effetto desiderato. Ho anche impostato la proprietà Focusable
su false
. Ciò ha aiutato per i controlli TextBox, ma non per TreeView (e ha l'effetto indesiderato, che il TextBox non può più essere modificato, quindi non è una soluzione per me).
Quindi la mia domanda è: come posso definire una scorciatoia da tastiera che funzioni ovunque nella finestra principale?
Puoi anche controllare la raccolta di InputBindings invece di CommandBindings. A volte non hai RoutedCommand in CommandBindings ... – Anvaka
Sì, l'ho dimenticato, grazie per il suggerimento :-) –
Questo è un vero toccasana. Grazie! – tltjr