【发布时间】:2015-09-21 10:11:07
【问题描述】:
我有一个列表视图,我在其中显示对象及其状态和名称。该状态被一个按钮包围,当我单击它时,状态从活动变为非活动或相反。 现在我想在单击鼠标按钮时更改状态,并在鼠标按钮上升时将其更改回来。我的按钮必须触发“PreviewMouseLeftButtonDown”和“PreviewMouseLeftButtonUp”,如下面的代码所示。在 SendStateMessage() 方法中,状态被发送到 SCADA 服务器,服务器将新状态发回给我,GUI 编辑更改。
通常它不会产生任何问题,但是当我单击快速时,不会调用“PreviewMouseLeftButtonUp”事件。所以控制台上没有显示“MouseUp”。
我尝试在第一个 mouseDown 事件中调用 Task.Delay(),因为我认为该方法需要更多时间,但效果不佳。所以我想问你是否有人知道问题可能是什么以及如何解决这个问题。
感谢您的宝贵时间。
private void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//_CurrentItem is an object of the class VM on which the click is executed.
_CurrentItem = sender as FrameworkElement).DataContext as VM
_CurrentItem.SendStateMessage();
}
private void Button_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Console.WriteLine("MouseUp");
}
编辑:
经过一段时间后,我有了另一个解决问题的想法,这也很有效。我只等待 MouseDownEvent,如果它被触发,我有一个循环,只要按下鼠标,我就会等待,当鼠标被释放时,我可以离开循环并在那里插入我想要在 MouseUPEvent 中执行的代码.
【问题讨论】:
-
嘎嘎声像双击问题,你的sn-p对诊断问题没有帮助。
-
感谢您的快速回答,但不是双击问题。您可以以不同的方式单击,或者单击鼠标按钮并按住它,或者您也可以非常快速地单击它,这就是我的问题。正如我所说,我认为服务器需要很长时间,因此不会触发事件。但我没有办法解决它。
-
到我的代码 sn-p:在方法“SendStateMessage()”中,我向服务器发送一条消息,其中包含状态是否处于活动状态的信息,如这行代码:ScadaHMIService.SendUserMessage (new MsgUserModuleCommand("IO-Tool", ModuleUid, Enums.UserModuleCommands.Off));
标签: c# events button mouseevent