所以我有以下KeyBindings:
<Page.InputBindings>
<KeyBinding Key="Space" Command="{Binding AcceptCommand}" />
<KeyBinding Key="Esc" Command="{Binding CancelCommand}"/>
</Page.InputBindings>
我还使用附加行为将InputBindings传播到祖先窗口,因为如果我没有焦点问题,并且命令不会在我想要的时候被调用。 Here's a link方便的做法。
我的问题是KeyBindings发生在KeyDown上,我希望它们发生在KeyUp上。从我所读过的内容来看,这是不可能的,而你必须处理KeyUp事件并从代码隐藏中做所有事情。虽然这不太理想,但如果必须的话,我会这样做,但是我不知道我如何将KeyUp从页面传播到窗口。
我尝试制作类似于输入绑定的附加行为,但事件的本质是我不能分离事件,也不检查事件是否为空,除非我在实际的类中拥有该事件(在本例中为Page)。
任何人对如何做到这一点都有任何想法?
答案 0 :(得分:0)
我从InputBinding中创建了以下KeyUpBinding,以防您需要添加更多依赖项属性,因为CommpandParameter只是作为对象添加:
public class KeyUpBinding : InputBinding
{
public Key Key
{
get { return (Key)GetValue(KeyProperty); }
set { SetValue(KeyProperty, value); }
}
public static readonly DependencyProperty KeyProperty =
DependencyProperty.Register("Key", typeof(Key), typeof(KeyUpBinding), new PropertyMetadata(Key.A, KeyChanged));
private static void KeyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var keybinding = (d as KeyUpBinding);
Keyboard.AddKeyUpHandler(App.Current.MainWindow, (s, ku) =>
{
if(keybinding.Command!=null && ku.Key == keybinding.Key && ku.IsUp)
{
keybinding.Command.Execute(null);
}
});
}
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(KeyUpBinding), new PropertyMetadata(null));
}