WPF - 在鼠标左键按下打开ContextMenu

时间:2011-02-25 11:41:35

标签: .net wpf contextmenu onmousedown

在谷歌浏览器中,我非常喜欢左后方按住“返回”按钮的功能,以获取完整的浏览历史记录。

在我的WPF应用程序中:对于带有上下文菜单的按钮,如何在按住鼠标左键的同时打开菜单(当然还有常规的右键单击)?

2 个答案:

答案 0 :(得分:3)

我建议通过在那里启动计时器来处理MouseDown事件。如果触发MouseUp事件,则需要停止计时器。您可以使用DispatcherTimer。然后,您可以设置一个时间,之后应该触发Timer_Tick事件,您可以在其中执行您想要执行的操作。为了避免冒泡MouseDownMouseUp事件的问题,我建议在窗口构造函数中添加两个处理程序,而不是在XAML中添加它们(至少在我的示例中没有触发事件)代码,所以我改变了)使用

button1.AddHandler(FrameworkElement.MouseDownEvent, new MouseButtonEventHandler(button1_MouseDown), true);
button1.AddHandler(FrameworkElement.MouseUpEvent, new MouseButtonEventHandler(button1_MouseUp), true);

此外,您需要在那里设置计时器:

在窗口类中添加一个字段:

DispatcherTimer timer = new DispatcherTimer();

并设置计时器,以及等待Timer_Tick事件被触发的时间(也在窗口构造函数中):

timer.Tick += new EventHandler(timer_Tick);
// time until Tick event is fired
timer.Interval = new TimeSpan(0, 0, 1);

然后你只需处理这些事件就完成了:

private void button1_MouseDown(object sender, MouseButtonEventArgs e) {
    timer.Start();
}

private void button1_MouseUp(object sender, MouseButtonEventArgs e) {
    timer.Stop();
}

void timer_Tick(object sender, EventArgs e) {
    timer.Stop();
    // perform certain action
}

希望有所帮助。

答案 1 :(得分:0)

我认为你唯一的办法就是在按钮上手动处理MouseDown / Move / Up事件,在MouseDown发生后等待一段时间才能通过,如果在这段时间内没有MouseMove或MouseUp事件,然后手动显示ContextMenu。如果您显示上下文菜单,则必须注意该按钮之后不生成Click事件并执行默认点击操作。