【问题标题】:Inputbinding - Delay Between Mouse Clicks, EventToCommand Works Fine输入绑定 - 鼠标点击之间的延迟,EventToCommand 工作正常
【发布时间】:2013-09-12 19:21:31
【问题描述】:

直到今天,我一直在使用 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 (我设置的几乎相同)的另一件事是,每次单击圆圈时,任务管理器都会显示程序的内存使用量增加了一点。这正常吗?

【问题讨论】:

    标签: c# wpf xaml mvvm-light inputbinding


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 感谢您如此彻底的回复。您找到的信息肯定很有帮助,我非常感谢您在回答中付出的时间和精力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多