【问题标题】:EventToCommand vs InputBindings ProblemEventToCommand 与 InputBindings 问题
【发布时间】:2011-07-07 01:58:15
【问题描述】:

我创建了解决方案来重现我在使用 MVVM-Light EventToCommand 与 InputBindings 时遇到的问题。问题围绕一个窗口打开另一个窗口,如果我有一个 InputBinding 连接到转义键并关闭第二个视图,它会关闭第二个视图并返回到第一个。如果我改用 EventToCommand,然后手动调用相同的命令,它会关闭第二个视图,它也会关闭第一个。

我预计没有代码会有点难以看到,因此我创建了一个测试解决方案来重现该问题。

步骤如下:

按预期工作

1) 单击第一个窗口的按钮打开第二个窗口。

2) 按第二个转义键使用输入绑定

问题案例

1) 单击第一个窗口的按钮打开第二个窗口。

2) 点击“Hello”文本框 3) 按 Escape 键使用 EventToCommand 路径,两个窗口都关闭?

Example Solution

【问题讨论】:

    标签: wpf c#-4.0 mvvm-light


    【解决方案1】:

    您必须通知 WPF 事件处理机制,按钮按下已在您的事件处理程序中处理,并且不应在事件链中冒泡。如果您不这样做,则您的文本框正在活动窗口(window2)上调用关闭,而转义处理程序正在活动窗口上调用关闭(window1 因为 window2 已被文本框的转义处理程序关闭)。因此,如果您按以下方式修改 Close2 函数,则一切正常:

        public void Close2(KeyEventArgs e)
        {
            if (e.Key == Key.Escape)
                Close();
            e.Handled = true;
        }
    

    【讨论】:

    • 当然!仅仅因为它是 WPF 并不意味着 Windows 事件发生变化。谢谢。
    【解决方案2】:

    我认为问题在于您在 EventToCommand 侦听器中挂钩 PreviewKeyDown 事件。我认为它是在 KeyUp 和 KeyPress 事件触发之前对按下的键做出反应并关闭窗口。这意味着 KeyUp 和 KeyPress 将在主窗口上触发,主窗口会通过关闭来做出反应。

    我在您的示例中将 EventName 更改为 PreviewKeyPress,这似乎解决了问题。我能够按 Escape 并让它只关闭顶部窗口。

    【讨论】:

    • 在实际代码中,我更改为 PreviewKeyUp,这似乎也有效。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2016-01-10
    • 2011-02-09
    相关资源
    最近更新 更多