我有一个将鼠标事件调度到侦听器列表的方法。问题是,如果我只是使用
[Obsolete]
private void DispatchOld(MouseEvent e)
{
foreach (var listener in _listeners)
{
listener.OnMouse(e, _currentState);
}
}
然后,当我双击鼠标时,立即触发左键单击,然后双击。我试图这样做,如果我双击,这是唯一的
触发的事件,没有左键单击。所以基本上如果检测到左键单击,我想暂缓发送该事件,直到我知道下一次是否发生双击,否则
只处理中间点击,右键单击等事件,通常没有任何延迟或修改。使用我的新代码,这几乎可以工作,除了我只是单身左边
单击,该事件不会触发,而是等待并触发双击。有人可以建议一种方法来解决这个问题,我想检测单个左键单击和双击但是
没有检测到左边紧跟一个双重。所以LRLRLDLLLD应该是LRLRDLLD。事件是Stack<MouseEvent>
。添加事件后,将在Update循环中调用Dispatch。
private void Dispatch()
{
bool wait = false;
foreach (var item in Events)
{
if (!wait)
{
if (item == MouseEvent.LeftClick) { wait = true; } // Delay the left click
else
{
foreach (var listener in _listeners)
{
listener.OnMouse(item, _currentState);
}
}
}
else
{
if (item == MouseEvent.DoubleClick)
{
foreach (var listener in _listeners)
{
listener.OnMouse(MouseEvent.DoubleClick, _currentState);
}
}
else
{
foreach (var listener in _listeners)
{
listener.OnMouse(MouseEvent.LeftClick, _currentState); // The delayed event
listener.OnMouse(item, _currentState);
}
}
wait = false; // Delt with wait, continue as normal
}
}
Events.Clear();
}
我无法找到解决这个问题的方法,我的代码感觉凌乱和重复,我可以重命名并使用dispatchOld来摆脱一些重复,但我想在一个方法中拥有所有东西。我的程序的另一部分正在触发事件流,它可以正常工作,检测事件并发送它们。
\\\\\\\\\\\\\\\\\\\\\\\ ANSWERED \\\\\\\\\\\\\\\\\\\\\\\
编辑:我似乎使用System.Diagnostics.StopWatch()
解决了这个问题。
使用System.Diagnostics中包含的秒表,我能够获得所需的行为
private Stopwatch _delayTimer = new Stopwatch();
private void Dispatch(MouseEvent e)
{
foreach (var listener in _listeners)
{
listener.OnMouse(e, _currentState);
}
}
private void Dispatcher()
{
const long maxDelay = 200;
foreach (var item in Events)
{
if (_delayTimer.IsRunning) // Running because Left trigger
{
if (item == MouseEvent.DoubleClick)
{
_delayTimer.Reset();
Dispatch(MouseEvent.DoubleClick);
return; // Delt with
}
if (_delayTimer.ElapsedMilliseconds >= maxDelay) // Waited too long, must be a real left click
{
_delayTimer.Reset();
Dispatch(MouseEvent.LeftClick);
Dispatch(item);
return; // Delt with
}
}
else
{
if (item == MouseEvent.LeftClick) // Ignore and return, but start timer from zero
{
_delayTimer.Restart();
return;
}
Dispatch(item);
}
}
}
它仍然有点凌乱,我将Dispatch重命名为Dispatcher并重命名为DispatchOld Dispatch。这样可以避免在Dispatcher方法中重复自己。我也已经意识到我可能不需要使用堆栈,因为每次在我的更新代码中检测到事件时,都会调用Dispatcher,因此永远不会有累积的堆栈。我正在优化代码。目前,上述工作与广告一样,我再次提出问题并自己回答。