0

我想控制用户在用鼠标单击时是单击还是双击。所以我使用这段代码:

private void MouseSingleClickCommand(RoutedEventArgs e)
{
    _dtMouseClick.Start();
}


private void MouseClick_Tick(object sender, System.EventArgs e)
{
    _dtMouseClick.Stop();

    //my one click code
}



private void MouseDoubleClickCommand(MouseButtonEventArgs e)
{
    _dtMouseClick.Stop();
    //code of the double click
}

_dt 是在视图模型的构造函数中创建的 DispatcherTimer:

_dtMouseClick =
                new System.Windows.Threading.DispatcherTimer(
                new TimeSpan(0, 0, 0, 0, 200),
                System.Windows.Threading.DispatcherPriority.Background,
                MouseClick_Tick,
                System.Windows.Threading.Dispatcher.CurrentDispatcher);

但是,由于调度程序没有停止,因此始终执行一键式代码。

为什么?。

谢谢。

编辑:我包括按钮的 axml:

<StackPanel Height="Auto" HorizontalAlignment="Left" Margin="548,0,0,0" Name="stpBotnoesBasicos" VerticalAlignment="Top" Width="Auto">
                    <Button Content="Buscar" Height="23" Name="btn01" Width="75">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Click">
                                <cmd:EventToCommand Command="{Binding MouseSingleClickCommand}" PassEventArgsToCommand="True"/>
                            </i:EventTrigger>

                                <i:EventTrigger EventName="MouseDoubleClick">
                                <cmd:EventToCommand Command="{Binding MouseDoubleClickCommand}" PassEventArgsToCommand="True"/>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                    </Button>
</Stackpannel>
4

2 回答 2

1

您在第一个勾号(_dtMouseClick.Stop();MouseClick_Tick)后停止它。尝试以下更改以获得更清晰的图片:

private void MouseClick_Tick(object sender, System.EventArgs e)
{
    MessageBox.Show("One tick more");
}

并将 更改Interval为 1 秒 ( new TimeSpan(0, 0, 0, 0, 1000))。

现在,MessageBox每秒弹出一次,直到您双击(MouseDoubleClickCommand被调用)。在里面MouseClick_Tick你必须放置定期触发的代码,而不是避免Timer运行的代码。

澄清

必须使用计时器的预期方式包括三个部分:开始,做任何事情(在 _tick 事件上),一旦不再有用就停止。例如如何注册点击次数?

Int clicksCounter = 0; //Declared globally.

您存储您想要的信息(点击次数);并在需要时启动计时器。

private void MouseLeftButtonDownCommand(MouseButtonEventArgs e)
{
     clicksCounter = clicksCounter + 1;
     if (clicksCounter == 1)
     {
         _dtMouseClick.Start(); //(set a small enough interval: 50ms or 10ms or even 1ms).
     }
}

现在您必须从方法中检查目标变量的值_Tick(它可以在需要时自行停止),即:

private void MouseClick_Tick(object sender, System.EventArgs e)
{
   //This event should be called as quickly as possible in order to check clicks at any time
    if(clicksCounter >= 2)
    {
        //Condition met. Reset the variables
        clicksCounter = 0;
        _dtMouseClick.Stop(); 
       MessageBox.Show("The user has clicked the mouse button more than once");
    }
}
于 2013-08-23T11:45:56.640 回答
0

该解决方案基于其他问题的解决方案:

基础溶液

如果我使用 PreviewMouseLeftButtonDown 来控制单击或双击何时起作用,而不是使用两个事件(单击和双击)。

所以我用这段代码解决了这个问题:

第一种方法是用鼠标控制点击。

private void MouseLeftButtonDownCommand(MouseButtonEventArgs e)
        {

            if (e.ClickCount == 1)
            {
                _dtMouseClick.Start();
            }

            else if(e.ClickCount > 1)
            {
                _dtMouseClick.Stop();

                //the code of the double click
            }
        }

此方法是链接到 DispatcherTimer 的方法,即如果未通过第二次单击鼠标而停止则执行。

private void MouseClick_Tick(object sender, System.EventArgs e)
        {
            _dtrMouseClick.Stop();

            //code of the single click                
        }

dispatcherTimer 在视图模型的构造函数中创建

_dtBotonBuscarMouseClick =
                new System.Windows.Threading.DispatcherTimer(
                new TimeSpan(0, 0, 0, 0, 250),
                System.Windows.Threading.DispatcherPriority.Background,
                MouseClick_Tick,
                System.Windows.Threading.Dispatcher.CurrentDispatcher);
            _dtMouseClick.Stop();

间隔为 250 毫秒,即用户必须双击的时间间隔。

在这个解决方案中,我使用相同的方法来停止 dispatcherTimer,即 stop() 方法,但由于某种原因,如果我使用两个事件(click 和 mouseDoubleClick),dispatcherTimer 不会在双击时停止,如果我使用 MouseLeftButtonDown事件解决方案有效。

编辑

对我来说,这个解决方案按我的预期工作。

在 MouseLeftButtonDown 事件中,我检查 ClickCount 是 1 还是 2。如果计数是 1,则启动计时器。因此,如果之前没有停止,计时器将执行其代码。

如果第二次单击是双击,计时器将停止。这是 ClickCounter > 1 时。如果单击之间的间隔时间足够大,则 clickcounter 始终为 1,因此此事件 MouseLeftButtonDown 控制何时双击。

当计时器执行时,首先我停止它,因为我想执行一次它的代码,我想要的代码只需单击一次。

如果我双击,那么我会在达到间隔之前停止计时器,所以从不执行,并在双击时执行我想要的代码。

于 2013-08-24T10:59:05.533 回答