Как сделать так, чтобы элемент управления возвращал попадание из HitTest только по нажатию правой кнопки мыши? - PullRequest
1 голос
/ 05 октября 2011

Я хочу открыть контекстное меню, когда пользователь щелкает правой кнопкой мыши по объекту, но я хочу пропустить все другие нажатия мыши через него.

  protected override HitTestResult HitTestCore( PointHitTestParameters hitTestParameters )
  {
     var hitPoint = hitTestParameters.HitPoint;
     if ( ( _xOffset <= hitPoint.X && hitPoint.X <= _xOffset + _width ) &&
          _isRightClick )
     {
        return new PointHitTestResult( this, hitPoint );
     }
     return null;
  }

Как мне узнать _isRightClick?

Любые лучшие архитектурные решения приветствуются. :)

Ответы [ 2 ]

1 голос
/ 05 октября 2011

почему бы не переопределить методы onmouseclick / onmouseup? у них есть mouseeventargs, которые включают информацию о мышах.

    public override void OnMouseUp(EditableGraphicsLayer layer, MouseButtonEventArgs e)
    {
        if (IsRightButtonChanged(e))
        {
            // do stuff
        }
    }

    private bool IsRightButtonChanged(MouseButtonEventArgs args)
    {
        return args.ChangedButton == MouseButton.Right;
    }

РЕДАКТИРОВАТЬ: или, основываясь на вашем комментарии, если вы не можете переопределить эти методы и должны решить эту проблему в одиночку, возможно, вы могли бы прочитать состояние кнопок мыши из статического класса Mouse, например, так:

Console.WriteLine(Mouse.RightButton);
0 голосов
/ 05 октября 2011

ПРИМЕЧАНИЕ: mtjin действительно помог мне подтолкнуть меня в правильном направлении.

Я решил, что его идея работает путем аннулирования визуала, когда событие prenotify запускается inputmanager.

  public MyClass()
  {
     InitializeComponent();

     InputManager.Current.PreNotifyInput += InputManagerPreNotifyInput;
  }

  private void InputManagerPreNotifyInput( object sender, NotifyInputEventArgs e )
  {
     var mouseEventArgs = e.StagingItem.Input as MouseEventArgs;
     if ( mouseEventArgs == null )
        return;

     if ( mouseEventArgs.RoutedEvent == PreviewMouseDownEvent )
     {
        InvalidateVisual();
     }
  }

  protected override HitTestResult HitTestCore( PointHitTestParameters hitTestParameters )
  {
     var hitPoint = hitTestParameters.HitPoint;
     if ( ( _xOffset <= hitPoint.X && hitPoint.X <= _xOffset + _width ) &&
          Mouse.RightButton == MouseButtonState.Pressed )
     {
        return new PointHitTestResult( this, hitPoint );
     }

     return null;
  }
...