Проблема при получении события щелчка мышью на пользовательском объекте DrawingVisual UIElement - PullRequest
2 голосов
/ 19 марта 2019

Я пытаюсь добавить рисунок визуального объекта на холсте с помощью MouseButtonEventHandler.Но не удалось получить событие клика.Что я здесь не так делаю?

public class VisualHost : UIElement
    {

        public Visual myVisual { get; set; }

        public VisualHost()
        {
            Visibility = Visibility.Visible;
            IsHitTestVisible = true;
            MouseLeftButtonUp += new MouseButtonEventHandler(MyVisualHost_MouseLeftButtonUp);
        }

        protected override int VisualChildrenCount
        {
            get { return myVisual != null ? 1 : 0; }
        }

        protected override Visual GetVisualChild(int index)
        {
            return myVisual;
        }

       //mouse event
        private void MyVisualHost_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show("You clicked a drawing-Visual");

        }
    }


 private void AddMyVisualObject()
    {
        GeometryDrawing myRectDrawing = new GeometryDrawing(Brushes.Yellow, new Pen(Brushes.White, 1.5), new RectangleGeometry(new Rect(0, 0, 200, 100)));
        DrawingVisual myDV = new DrawingVisual();
        DrawingContext myDC = myDV.RenderOpen();
        myDC.DrawDrawing(myRectDrawing);
        myDC.Close();
        VisualHost myVH = new VisualHost { myVisual = myDV };
        myDrawingCanvas.Children.Add(myVH);
    }

Требуется помощь, как можно вызвать события при нажатии на DrawingVisual?

1 Ответ

3 голосов
/ 19 марта 2019

Вы должны использовать VisualCollection для размещения своих Visual элементов и, кроме того, самостоятельно выполнить их проверку на попадание:

public class VisualHost : FrameworkElement
{
  private VisualCollection Children { get; set; }

  public VisualHost()
  {
    this.Children = new VisualCollection(this);
    this.MouseLeftButtonUp += MyVisualHost_MouseLeftButtonUp;
  }

  public void AddChild(Visual visual)
  {
    this.Children.Add(visual);
  }

  protected override int VisualChildrenCount => this.Children.Count;

  protected override Visual GetVisualChild(int index) => this.Children[index];

  //mouse event
  private void MyVisualHost_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  {
    // Initiate the hit test by setting up a hit test result callback method.
    VisualTreeHelper.HitTest(this, null, OnVisualClicked, new PointHitTestParameters(e.GetPosition((UIElement) sender)));
  }

  private HitTestResultBehavior OnVisualClicked(HitTestResult result)
  {
    if (result.VisualHit.GetType() == typeof(DrawingVisual))
    {
      MessageBox.Show("You clicked a DrawingVisual");   
    }

    // Stop the hit test enumeration of objects in the visual tree.
    return HitTestResultBehavior.Stop;
  }
}

Затем инициализируйте хост:

private void AddMyVisualObject()
{
  GeometryDrawing myRectDrawing = new GeometryDrawing(Brushes.Yellow, new Pen(Brushes.White, 1.5), new RectangleGeometry(new Rect(0, 0, 200, 100)));
  DrawingVisual myDV = new DrawingVisual();
  DrawingContext myDC = myDV.RenderOpen();
  myDC.DrawDrawing(myRectDrawing);
  myDC.Close();

  VisualHost myVH = new VisualHost();
  myVH.AddChild(myDV);
  this.Canvas.Children.Add(myVH);
}

См. MSDN для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...