WPF C# Tutorial

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Input;
    public class WindowHostingVisual : Window
    {
        DrawingVisual ghostVisual = null;
        public WindowHostingVisual()
        {
            ghostVisual = new DrawingVisual();
            using (DrawingContext dc = ghostVisual.RenderOpen())
            {
                dc.DrawGeometry(Brushes.Blue, null, Geometry.Parse(
                @"M 240,250
                  C 200,375 200,250 175,200
                  C 75,0 100,0 150,0
                  C 200,0 250,0 250,150 Z"));
                Pen p = new Pen(Brushes.Black, 10);
                p.StartLineCap = PenLineCap.Round;
                p.EndLineCap = PenLineCap.Round;
                dc.DrawLine(p, new Point(75, 160), new Point(175, 150));
            }
            AddVisualChild(ghostVisual);
            AddLogicalChild(ghostVisual);
        }
        protected override int VisualChildrenCount
        {
            get { return 1; }
        }
        protected override Visual GetVisualChild(int index)
        {
            if (index != 0)
                throw new ArgumentOutOfRangeException("index");
            return ghostVisual;
        }
        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);
            Point location = e.GetPosition(this);
            HitTestResult result = VisualTreeHelper.HitTest(this, location);
            if (result.VisualHit == ghostVisual)
            {
                if (ghostVisual.Transform == null)
                    ghostVisual.Transform = new RotateTransform();
                (ghostVisual.Transform as RotateTransform).Angle++;
            }
        }
        [STAThread]
        public static void Main()
        {
            WindowHostingVisual whv = new WindowHostingVisual();
            whv.ShowDialog();
        }        
    }