如果不将WPF更改为三次点击,我怎样才能重复双击?

时间:2011-03-10 00:11:49

标签: wpf double-click

我的WPF应用程序中有一个列表框,当用户双击某个项目时,我会更改列表的内容(类似于目录导航)。在某些情况下,双击是有意义的,然后立即再次双击,因为您知道将在同一位置出现什么。您可以通过快速连续点击四次(这应该意味着“两次双击”)来实现这一点。

但这不起作用。如果你点击快速射击,那么直到WPF之前的第五次或第六次点击才会发送另一次双击事件!

看起来WPF内置支持三次点击,有时甚至更多,如果你点击足够快。我跑了一个简单的例子来证实这一点:

<ListBox PreviewMouseLeftButtonDown="ListBox_PreviewMouseLeftButtonDown"/>

private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Trace.WriteLine("ClickCount = " + e.ClickCount);
}

当我运行它并点击快速射击时,我得到了这样的输出:

ClickCount = 1
ClickCount = 2
ClickCount = 3
ClickCount = 1
ClickCount = 2
ClickCount = 3
ClickCount = 4
ClickCount = 1
ClickCount = 2
ClickCount = 3

有时它会计数到3然后重置;有时它会在重置之前计数到4。我无法达到5。

然后我进入控制面板&gt;鼠标,并将我的双击速度更改为最慢的设置。然后我可以在重置之前可靠地计算到10,如果我真的预订它,最多可以达到11或12。显然,所有这些都是关于在系统配置的“双击”间隔之前可以多快地点击。如果在该间隔过去之前单击更多次,则会出现“三击”或“四击”或更多次。

但我想要三次点击或四次点击 - 尤其是如果某些双击配置无法获得它们。我希望每次点击都是双击事件(只要它们快速连续,鼠标的移动速度不超过阈值数量等)。

当我点击快速射击时,有什么方法可以让WPF给我正常的双击事件(每次其他点击的事件)?

2 个答案:

答案 0 :(得分:1)

使用几个实例变量:_LastMouseDownTime和_LastMouseDownWasDoubleClick:

    private int _LastMouseDownTime;
    private bool _LastMouseDownWasDoubleClick;

    private void ListBox_PreviewMouseDown(object sender, MouseButtonEventArgs e) {
        if(e.Timestamp - _LastMouseDownTime <= System.Windows.Forms.SystemInformation.DoubleClickTime && !_LastMouseDownWasDoubleClick) {
            Debug.Print("DoubleClick - StupidWorthlessClickCount:{0}", e.ClickCount);
            _LastMouseDownWasDoubleClick = true;

            //Do some double clicking goodness
        } else {
            Debug.Print("FirstClick - StupidWorthlessClickCount:{0}", e.ClickCount);
            _LastMouseDownWasDoubleClick = false;

            //Do some single clicking goodness
        }
        _LastMouseDownTime = e.Timestamp;
        base.OnMouseDown(e);
    }

我知道这是超级hacky而且不是很灵活,但它应该能满足你的需求。我正在尝试让WPF RichTextBox响应那些第4,第5等点击,比如它们是第1,第2等,以使选择工作更自然,但这可能被证明是不可能的! :)

希望这有帮助。

答案 1 :(得分:0)

ClickCount显示用户在系统双击时间内点击了多少次。因此,如果您只需要双击即可回复:

private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount % 2 == 1)
        return;
    Trace.WriteLine(e.ClickCount + " " + DateTime.Now);
}

输出:

//2 clicks:
2 10.03.2011 16:05:17
//4 clicks:
2 10.03.2011 16:05:20
4 10.03.2011 16:05:20
//3 clicks:
2 10.03.2011 16:05:26