XamlBehaviorsWpf WPF 行为不适用于 KeyUp

问题描述

我正在使用 Microsoft XamlBehaviorsWpf [标签丢失!评分足够高的人可以在我的 WPF 应用程序中添加]。 我的 XAML 中有四个行为触发器,如下所示。

我发现 KeyDown 触发器工作正常,但 KeyUp 事件不是。

有人知道为什么吗?

xmlns:behaviors="http://schemas.microsoft.com/xaml/behaviors"
....

<behaviors:KeyTrigger Key="LeftCtrl" FiredOn="KeyDown">
    <behaviors:CallMethodAction Targetobject="{Binding}" MethodName="CtrlDown"/>
</behaviors:KeyTrigger>
<behaviors:KeyTrigger Key="RightCtrl" FiredOn="KeyDown">
    <behaviors:CallMethodAction Targetobject="{Binding}" MethodName="CtrlDown"/>
</behaviors:KeyTrigger>
<behaviors:KeyTrigger Key="LeftCtrl" FiredOn="KeyUp">
    <behaviors:CallMethodAction Targetobject="{Binding}" MethodName="CtrlUp"/>
</behaviors:KeyTrigger>
<behaviors:KeyTrigger Key="RightCtrl" FiredOn="KeyUp">
    <behaviors:CallMethodAction Targetobject="{Binding}" MethodName="CtrlUp"/>
</behaviors:KeyTrigger>
....

这是我的 viewmodel

    public void CtrlDown()
    {
        cntrlSelected = true;
        MessageBox.Show("down");
    }

    public void CtrlUp()
    {
        MessageBox.Show("up");
        cntrlSelected = false;
    }

编辑

以下是可用 FiredOn 选项的屏幕截图:

enter image description here

编辑 2

此问题已在 GitHub 上提出,但现在已经有 8 个月未收到回复,因此不确定这是错误,还是我(以及其他人)没有正确使用该库。

链接Issue #77

解决方法

我发现 KeyDown 触发器工作正常,但 KeyUp 事件不是

我能够自己复制这种行为,老实说我不确定为什么 FiredOn => KeyUp 不起作用(我需要进行更多调查)。我还要感谢您提供指向 GitHub 上提出的问题的链接,目前似乎也没有人分配到此问题。

我可以通过将 TriggerType 更改为 EventTrigger 来解决此问题,请参见下文:

.xaml 更改

<behaviors:EventTrigger EventName="KeyUp">
   <behaviors:CallMethodAction MethodName="CtrlUp" TargetObject="{Binding}" />
</behaviors:EventTrigger>

通过此更改,我们现在需要更改支持的视图模型/代码 CtrlUp 方法签名。另外值得一提的是 CallMethodAction 确实接受参数,在这种情况下我们确实需要。请参阅以下更改:

public void CtrlUp(object sender,KeyEventArgs e)
{
   if(e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
   {
      Console.WriteLine("UP");
   }
}

我知道这是解决实际问题的方法,但确实有效。希望该团队能够调查问题的根本原因并加以解决。

使用的所有代码

MainWindow.xaml

<Window x:Name="myUserControl"
        x:Class="WpfApp14.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:behaviors="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:WpfApp14"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="800"
        Height="450"
        mc:Ignorable="d"
        >
    <behaviors:Interaction.Triggers>
        <behaviors:EventTrigger EventName="KeyUp">
            <behaviors:CallMethodAction MethodName="CtrlUp" TargetObject="{Binding}" />
        </behaviors:EventTrigger>
        <behaviors:KeyTrigger Key="LeftCtrl" FiredOn="KeyDown">
            <behaviors:CallMethodAction MethodName="CtrlDown" TargetObject="{Binding}" />
        </behaviors:KeyTrigger>
    </behaviors:Interaction.Triggers>

    <Grid x:Name="grid" />
</Window>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    public void CtrlUp(object sender,KeyEventArgs e)
    {
        if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
        {
            Console.WriteLine("UP");
        }
    }

    public void CtrlDown() => Console.WriteLine("DOWN");
}

我也在使用版本:1.1.31Microsoft.Xaml.Behaviors.Wpf

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...