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();
}
}
|