Я пытаюсь расширить Button, чтобы добавить событие RightClick.Могу ли я продлить кнопку, чтобы добавить событие 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;
}
}
См. Соответствующий вопрос для одной из моих точек крепления: [Могу ли я получить событие MouseLeave во время мыши.Capture() активен?] (Http://stackoverflow.com/questions/9961050/can-i-get-a-mouseleave-event-while-mouse-capture-is-active) –