直到今天,我一直在使用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(我设置的几乎相同)的其他内容是,每次单击圆圈时,任务管理器会显示程序的内存使用量略微上升。这是正常的吗?
答案 0 :(得分:1)
我一直在调查你的问题...现在我没有使用RelayCommand
,而是更喜欢我自己的ActionCommand
,但我看了它的代码,他们实际上是一样的。所以,我将你的代码添加到一个新的WPF应用程序中,这就是我发现的:
当我点击圆圈时,立即会改变颜色。如果我再次点击它,立即会再次改变颜色。但是,如果我双击圆圈,它只会改变一次颜色,我本来希望它改变颜色两次。多次点击它会使它在白色和黑色之间交替,但只能以大约每秒两次的速度... 很多比点击率慢。
将Ellipse
更改为TextBlock
并更新点击处理程序中的Text
属性具有类似的结果。但是,当我用MouseBinding
事件的简单事件处理程序替换PreviewMouseLeftButtonDown
时,这个“慢反应时间”就会消失。
继续我的测试,然后我添加了Button
并在Command
属性上设置相同的 Command
(从TextBlock
中删除后})。这只是使用了我的ActionCommand
,它在每次点击时都能立即完美地工作。
因此,当使用这种路由方法{{1}时,似乎 确实是相同函数的多个调用之间的延迟通过Command
。虽然这个答案可能对您没有帮助,但我希望至少这个问题的确认会有所帮助。
关于内存问题,我不担心。 WPF通常很快就会要求记忆并且放慢速度。