KeyUp上的KeyBinding或将KeyUp传播到Window

时间:2015-04-16 20:54:54

标签: c# wpf xaml

所以我有以下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)。

任何人对如何做到这一点都有任何想法?

1 个答案:

答案 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));


}