输入绑定 - 鼠标点击之间的延迟,EventToCommand工作正常

时间:2013-09-12 19:21:32

标签: c# wpf xaml mvvm-light inputbinding

直到今天,我一直在使用MVVM Light的EventToCommand在XAML中进行事件处理。我决定尝试用于鼠标事件的InputBinding,到目前为止,结果远非令人满意。我猜我做错了,因为鼠标点击之间可能有半秒钟的延迟。使用EventToCommand,UI将以我单击它的速度更新。此刻所有测试程序在点击时在白色或黑色的画布上填充一个圆圈。

<Canvas>
    <Ellipse Canvas.Left="{Binding X}"
        Canvas.Top="{Binding Y}"
        Width="16"
        Height="16"
        Fill="Black">
        <Ellipse.InputBindings>
            <MouseBinding Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
                                AncestorType={x:Type UserControl}},
                                Path=DataContext.ClickEllipse}"
                       CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
                                AncestorType={x:Type Ellipse}}}"
                       MouseAction="LeftClick" />
</Ellipse.InputBindings>

public RelayCommand<object> ClickEllipse { get; set; }
ClickEllipse = new RelayCommand<object>((o) => ExecuteClickEllipse(o));

private void ExecuteClickEllipse(object o)
    {
        var obj = o as Ellipse;

        if (obj.Fill == Brushes.Black)
        {
            obj.Fill = Brushes.White;
            TestText = "White";
        }
        else
        {
            obj.Fill = Brushes.Black;
            TestText = "Black";
        }
    }

我在这里做错什么导致点击之间的延迟?我无法想象这将是预期的行为。我有几乎相同的EventToCommand设置,它没有问题。此外,假设我确实犯了一个愚蠢的错误并且这不是预期的行为,对于Key和Mouse事件,EventBoCommand的InputBinding是否有任何优点,反之亦然? 2在功能和性能方面有何不同(如果在这种情况下甚至出现问题)?

编辑 - 我注意到使用InputBinding和EventToCommand(我设置的几乎相同)的其他内容是,每次单击圆圈时,任务管理器会显示程序的内存使用量略微上升。这是正常的吗?

1 个答案:

答案 0 :(得分:1)

我一直在调查你的问题...现在我没有使用RelayCommand,而是更喜欢我自己的ActionCommand,但我看了它的代码,他们实际上是一样的。所以,我将你的代码添加到一个新的WPF应用程序中,这就是我发现的:

当我点击圆圈时,立即会改变颜色。如果我再次点击它,立即会再次改变颜色。但是,如果我双击圆圈,它只会改变一次颜色,我本来希望它改变颜色两次。多次点击它会使它在白色和黑色之间交替,但只能以大约每秒两次的速度... 很多比点击率慢。

Ellipse更改为TextBlock并更新点击处理程序中的Text属性具有类似的结果。但是,当我用MouseBinding事件的简单事件处理程序替换PreviewMouseLeftButtonDown时,这个“慢反应时间”就会消失。

继续我的测试,然后我添加了Button并在Command属性上设置相同的 Command(从TextBlock中删除后})。这只是使用了我的ActionCommand,它在每次点击时都能立即完美地工作。

因此,当使用这种路由方法{{1}时,似乎 确实是相同函数的多个调用之间的延迟通过Command。虽然这个答案可能对您没有帮助,但我希望至少这个问题的确认会有所帮助。

关于内存问题,我不担心。 WPF通常很快就会要求记忆并且放慢速度。