WPF - Открыть ContextMenu левой кнопкой мыши - PullRequest
3 голосов
/ 25 февраля 2011

В Google Chrome мне очень нравится функциональность левой кнопки мыши, чтобы получить полную историю просмотра.

В моем приложении WPF: для кнопки с контекстным меню, как я могу открыть меню, удерживая левую кнопку мыши (и, конечно, по-прежнему при обычном нажатии правой кнопки мыши)?

Ответы [ 2 ]

3 голосов
/ 25 февраля 2011

Я бы предложил обработать событие MouseDown, запустив там таймер.Если сработало событие MouseUp, таймер необходимо остановить.Для этого вы можете использовать DispatcherTimer.Затем вы можете настроить время, после которого должно быть запущено событие Timer_Tick, где вы можете выполнить действие, которое хотели бы выполнить.Чтобы избежать проблем с всплывающими событиями MouseDown и MouseUp, я бы предложил добавить два обработчика в конструктор окна вместо добавления их в 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
}

Надеюсь, это поможет.

0 голосов
/ 25 февраля 2011

Я думаю, что ваш единственный способ - вручную обработать события MouseDown / Move / Up над кнопкой, подождать некоторое время, которое пройдет после MouseDown, и если за это время у вас нет MouseMove или MouseUpсобытие, а затем вручную показать ContextMenu.Если вы откроете контекстное меню, вам нужно позаботиться о том, чтобы кнопка не генерировала событие Click после этого и выполняла его действие по умолчанию.

...