在我的WPF應用程序中,我希望將輸入手勢附加到命令中,以便輸入手勢在主窗口中全局可用,而不管哪個控件具有焦點。WPF:如何防止控件竊取關鍵手勢?
在我的情況下,我想將Key.PageDown
綁定到一個命令,但是,只要某些控件接收到焦點(例如TextBox或TreeView控件),這些控件就會接收到這些鍵事件,並且不再觸發該命令。這些控件沒有具體的定義CommandBindings
或InputBindings
。
這是我如何定義我的輸入手勢:
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>
代碼:
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);
}
}
我已經嘗試捕捉窗口的PreviewKeyDown
事件並將其標記爲處理這不得不不是預期的效果。我還將Focusable
財產設置爲false
。這對TextBox控件有幫助,但對TreeView沒有幫助(並且具有不希望的效果,即TextBox不再可以被編輯,因此它不是我的解決方案)。
所以我的問題是我怎樣才能定義一個鍵盤快捷方式在主窗口無處不在?
您可能還想檢查InputBindings集合而不是CommandBindings。有時候你在CommandBindings中不會有RoutedCommand ... – Anvaka 2009-12-14 12:42:00
是的,我忘記了,謝謝你的提示:-) – 2009-12-14 12:49:43
這是一個救星。謝謝! – tltjr 2013-09-24 21:41:03