Могу ли я расширить Button, чтобы добавить событие RightClick таким образом, чтобы также сохранялись графические побочные эффекты?

Я пытаюсь расширить 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;
    }
}
5
задан Grant Birchmeier 31 March 2012 в 23:20
поделиться