In meiner WPF-Anwendung möchte ich eine Eingabegeste an einen Befehl anhängen, so dass die Eingabegeste im Hauptfenster global verfügbar ist, egal welches Steuerelement den Fokus hat.WPF: Wie verhindert man, dass ein Steuerelement eine Tastengeste stiehlt?
In meinem Fall möchte ich Key.PageDown
an einen Befehl binden, aber sobald bestimmte Steuerelemente den Fokus erhalten (z. B. ein TextBox- oder TreeView-Steuerelement), erhalten diese Steuerelemente die Schlüsselereignisse und der Befehl wird nicht mehr ausgelöst. Diese Kontrollen haben keine spezifischen CommandBindings
oder InputBindings
definiert.
Dies ist, wie ich meine Eingabegeste definieren:
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>
Code:
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);
}
}
Ich habe bereits versucht, die PreviewKeyDown
Veranstaltung Fenster Fang- und Markierungs es Dies hatte als behandelt nicht der gewünschte Effekt. Ich setze auch die Eigenschaft auf false
. Dies half bei TextBox-Steuerelementen, aber nicht bei der TreeView (und hat den unerwünschten Effekt, dass die TextBox nicht mehr bearbeitet werden kann, so dass sie für mich keine Lösung darstellt).
Also meine Frage ist, wie kann ich eine Tastenkombination definieren, die überall im Hauptfenster funktioniert?
Sie können auch die EingabeBindings-Sammlung anstelle von CommandBindings überprüfen. Manchmal hast du keinen RoutedCommand in CommandBindings ... – Anvaka
Ja, das habe ich vergessen, danke für den Tipp :-) –
Das ist ein Lebensretter. Vielen Dank! – tltjr