En mi aplicación WPF me gustaría adjuntar un gesto de entrada a un comando para que el gesto de entrada esté disponible globalmente en la ventana principal, sin importar qué control tenga el foco.WPF: ¿Cómo evitar que un control robe un gesto clave?
En mi caso, me gustaría vincular Key.PageDown
a un comando, sin embargo, tan pronto como ciertos controles reciben el foco (por ejemplo, un control TextBox o TreeView), estos controles reciben los eventos clave y el comando ya no se activa. Estos controles no tienen definidos CommandBindings
o InputBindings
específicos.
Esto es como defino mi gesto de entrada:
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>
Código:
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);
}
}
ya he intentado coger el evento de la ventana PreviewKeyDown
y marcándolo como manejado Este tenía no es el efecto deseado También configuré la propiedad Focusable
en false
. Esto ayudó para los controles TextBox, pero no para TreeView (y tiene el efecto no deseado, que el TextBox ya no se puede editar, por lo que no es una solución para mí).
Así que mi pregunta es ¿cómo puedo definir un atajo de teclado que funcione en todas partes en la ventana principal?
También es posible que desee comprobar la colección de InputBindings en lugar de CommandBindings. A veces no tendrás RoutedCommand en CommandBindings ... – Anvaka
Sí, me olvidé de eso, gracias por el consejo :-) –
Esto es un salvavidas. ¡Gracias! – tltjr