Я пытаюсь расширить Button, чтобы добавить событие RightClick.
Мой клиент хочет, чтобы кнопка выполняла разные действия в зависимости от того, щелкаете ли вы левой или правой кнопкой мыши. Я ожидал, что будет простое событие для щелчка правой кнопкой мыши, но оказалось, что его нет.
Я бы предпочел, чтобы визуальное поведение Button было идентично существующему ранее событию Click, но это оказывается сложным. Кнопка имеет много графических действий, которые происходят, когда вы нажимаете и перетаскиваете кнопку.
Эти небольшие графические особенности будут выглядеть грубо, если визуальные эффекты при щелчке левой кнопкой мыши не совпадают с визуальными эффектами при щелчке правой кнопкой мыши.
В настоящее время я застрял на этом: Если щелкнуть правой кнопкой мыши и удерживать кнопку, а затем перетащить кнопку, как определить, что пользователь отменил щелчок? Мне нужно знать это, чтобы я мог знать, что нельзя повторно опускать кнопку при повторном входе.
Более широкий вопрос:На правильном ли я пути? Я не мог найти никого, кто делал это раньше. Мой код ниже.
public class RightClickButton : Button
{
public event RoutedEventHandler RightClick;
public RightClickButton()
{
this.MouseRightButtonDown += new System.Windows.Input.MouseButtonEventHandler(RightClickButton_MouseRightButtonDown);
this.MouseRightButtonUp += new System.Windows.Input.MouseButtonEventHandler(RightClickButton_MouseRightButtonUp);
this.MouseEnter += new System.Windows.Input.MouseEventHandler(RightClickButton_MouseEnter);
this.MouseLeave += new System.Windows.Input.MouseEventHandler(RightClickButton_MouseLeave);
}
void RightClickButton_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
this.IsPressed = true;
}
void RightClickButton_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
this.IsPressed = false;
if (RightClick != null)
RightClick.Invoke(this, e);
}
void RightClickButton_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
if (this.IsPressed)
this.IsPressed = false;
}
void RightClickButton_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
if (this.IsFocused && Mouse.RightButton == MouseButtonState.Pressed)
this.IsPressed = true;
}
}