1

直到今天,我一直在使用 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 设置,它没有问题。此外,假设我确实犯了一个愚蠢的错误并且这不是预期的行为,对于键和鼠标事件,InputBinding 是否比 EventToCommand 有任何优势,反之亦然?两者在功能和性能方面有何不同(如果在这种情况下这甚至是一个问题)?

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

4

1 回答 1

1

我一直在研究你的问题......现在我不使用它RelayCommand,而是更喜欢我自己的ActionCommand,但我已经查看了它的代码,它们实际上是相同的。因此,我将您的代码添加到了一个新的 WPF 应用程序中,这就是我发现的:

当我点击圆圈时,它会立即改变颜色。如果我再次单击它,它会立即再次改变颜色。但是,如果我双击这个圆圈,它只会改变一次颜色,而我预计它会改变两次颜色。多次单击它会使它在白色和黑色之间交替,但速度仅为每秒大约两次……单击速度慢得多。

将 a更改Ellipse为 aTextBlock并更新Textclick 处理程序中的属性具有相似的结果。但是,当我MouseBinding用一个简单的事件处理程序替换PreviewMouseLeftButtonDown事件时,这种“慢反应时间”就消失了。

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

因此,当使用这种通过 s 路由 s 的方法时,似乎在多次调用同一函数之间确实存在延迟。虽然这个答案可能对您没有帮助,但我希望至少这个问题的确认会在一些小方面有所帮助。CommandMouseBinding

关于内存问题,我不会担心。WPF 通常要求内存很快,但放手很慢。

于 2013-09-13T10:24:41.597 回答