Overlapping Visual Hit Testing : DrawingContext « Windows Presentation Foundation « C# / CSharp Tutorial






using System;
using System.Windows;
using System.Windows.Media;
using System.Collections.Generic;
using System.Windows.Input;

    public class WindowHostingVisual : Window
    {
        List<Visual> visuals = new List<Visual>();

        public WindowHostingVisual()
        {
            DrawingVisual bodyVisual = new DrawingVisual();
            using (DrawingContext dc = bodyVisual.RenderOpen())
            {
                dc.DrawGeometry(Brushes.Blue, null, Geometry.Parse(@"M 240,250 C 200,375 200,250 175,200 C 200,0 250,0 250,150 Z"));
            }
            visuals.Add(bodyVisual);
            foreach (Visual v in visuals){
                AddVisualChild(v);
                AddLogicalChild(v);
            }
        }
        protected override int VisualChildrenCount{
            get { return visuals.Count; }
        }
        protected override Visual GetVisualChild(int index)
        {
            if (index < 0 || index >= visuals.Count)
                throw new ArgumentOutOfRangeException("index");
            return visuals[index];
        }

        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);
            Point location = e.GetPosition(this);
            VisualTreeHelper.HitTest(this, null,
                new HitTestResultCallback(HitTestCallback),
                new PointHitTestParameters(location));
        }
        public HitTestResultBehavior HitTestCallback(HitTestResult result)
        {
            if (result.VisualHit.GetType() == typeof(DrawingVisual))
            {
                DrawingVisual dv = result.VisualHit as DrawingVisual;
                if (dv.Transform == null)
                    dv.Transform = new RotateTransform();

                (dv.Transform as RotateTransform).Angle++;
            }
            return HitTestResultBehavior.Continue;
        }
        [STAThread]
        public static void Main()
        {
            WindowHostingVisual whv = new WindowHostingVisual();
            whv.ShowDialog();
        }        
    }








24.171.DrawingContext
24.171.1.DrawingVisual and DrawingContext
24.171.2.Open DrawingContext from DrawingVisual
24.171.3.VisualTreeHelper.HitTest
24.171.4.Overlapping Visual Hit Testing
24.171.5.Hosting DrawingVisuals