所以我有这个条件将GUI对象捕捉到引导线对象。我想要的是对象捕捉到位,但如果系统仍然检测到鼠标移动,那么我希望该对象解除锁定并继续移动。我有抢购条件,但我对后者失败了。
这是我正在开火的事件,并且系统一直在监听它
private void UserControl_MouseMove(object sender, MouseEventArgs e)
{
if (IsMouseCaptured && snappedVertically) //The IsMouseCaptured listens for mouse movement and snapped vertically is what I am using to snap the GUI element
{
if (snappedVertically)
{
Thread.Sleep(2000); //wait 2 seconds...
snappedVertically = false; //...then unsnap
}
}
}
问题是应用程序中存在延迟,然后无响应,我必须重新启动。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
睡眠UI线程是导致无响应的原因。
只需比较事件的时间即可解决您的问题:
DateTime _lastEventTime = DateTime.MinValue;
private void UserControl_MouseMove(object sender, MouseEventArgs e)
{
if (IsMouseCaptured && snappedVertically) //The IsMouseCaptured listens for mouse movement and snapped vertically is what I am using to snap the GUI element
{
if (snappedVertically)
{
if ((DateTime.Now - _lastEventTime) < TimeSpan.FromSeconds(2))
{
snappedVertically = false;
}
}
}
_lastEventTime = DateTime.Now;
}
你的问题在期望的行为上并不十分清楚,但在这里,我们记录每次射击后的最后一次事件时间,然后如果我们垂直拍摄,检查最后一次事件是否发生在2秒前,如果它确实如此,然后我们想要解开。
根据澄清问题意图的评论,您可以轻松地在2秒后切换值:
private async void UserControl_MouseMove(object sender, MouseEventArgs e)
{
if (IsMouseCaptured && snappedVertically) //The IsMouseCaptured listens for mouse movement and snapped vertically is what I am using to snap the GUI element
{
if (snappedVertically)
{
await Task.Delay(2000);
snappedVertically = false;
}
}
}
请注意,因为很明显在等待那2秒时,用户可以再次移动鼠标,这将再次设置一个等待2秒的新计时器,依此类推;你很可能想要防止多次延误,但这对你来说是一种练习。
答案 1 :(得分:0)
也许您可以使用其他方法,例如UIElement.IsMouseOver
,以满足鼠标光标悬停在某个对象上?那你就不需要睡任何线程了。
如前所述,你的问题不是很清楚大局。