到今天为止,我一直在使用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有什么优势吗?反之亦然?2在功能和性能方面有什么不同(如果这是一个问题,在这种情况下)。
编辑-我还注意到InputBinding和EventToCommand(我的设置几乎相同)每次单击圆圈时,任务管理器显示程序的内存使用量会增加一点。这正常吗?
2条答案
按热度按时间epfja78i1#
我一直在研究你的问题...现在我不使用那个
RelayCommand
,而是更喜欢我自己的ActionCommand
,但我看了它的代码,它们几乎是一样的。所以,我把你的代码添加到一个新的WPF应用程序中,下面是我发现的:当我点击圆圈时,它会立即改变颜色。如果我再次点击它,它会立即再次改变颜色。但是,如果我双击圆圈,它只会改变一次颜色,我本以为它会改变两次颜色。多次点击它会使它在白色和黑色之间交替,但只有大约每秒两次的速度...比点击的速度慢得多。
将
Ellipse
更改为TextBlock
并更新click处理程序中的Text
属性会产生类似的结果。但是,当我将MouseBinding
替换为PreviewMouseLeftButtonDown
事件的简单事件处理程序时,这种“缓慢React时间”消失了。继续我的测试,然后我添加了一个
Button
,并在其Command
属性上设置了 sameCommand
(在将其从TextBlock
中删除后)。这只是使用了我的ActionCommand
,它在每次点击时都能立即完美地工作。因此,当使用这种通过
MouseBinding
路由Command
s的方法时,似乎在 * 多次 * 调用 * 同一 * 函数之间确实存在 * 延迟。虽然这个答案可能对您没有帮助,但我希望至少这个问题的确认会在一些小的方面有所帮助。关于内存问题,我不会担心这个。WPF经常快速请求内存,而缓慢释放它。
jyztefdp2#
我想我找到了一个解决办法。
“MouseAction”不会注册第二次点击,因为WPF认为这是双击。
因此,通过添加第二个“MouseAction”双击喊解决这个问题。
将此代码添加到鼠标绑定下。
我知道这是一个肮脏的解决方案,但我还没有找到一个更好的。