Я пытаюсь расширить Button, чтобы добавить событие RightClick.
Мой клиент хочет, чтобы кнопка делала разные вещи в зависимости от того, щелкнули ли вы левой или правой кнопкой мыши. Я ожидал, что будет легкое событие для щелчка правой кнопкой мыши, но оказывается, что нет.
Я бы предпочел, чтобы визуальное поведение Баттона было идентичным ранее существовавшему событию 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;
}
}