<Window x:Class="WpfApplication1.HitTestExample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WpfApplication1" Height="300" Width="300"> <Canvas x:Name="canvas1" MouseLeftButtonDown="OnMouseLeftButtonDown"> <Rectangle Canvas.Left="20" Canvas.Top="20" Width="100" Height="60" Stroke="Black" Fill="LightBlue" Opacity="0.7" /> <Rectangle Canvas.Left="70" Canvas.Top="50" Width="100" Height="60" Stroke="Black" Fill="LightBlue" Opacity="0.7" /> <Rectangle Canvas.Left="150" Canvas.Top="80" Width="100" Height="60" Stroke="Black" Fill="LightBlue" Opacity="0.7" /> <Rectangle Canvas.Left="20" Canvas.Top="100" Width="50" Height="50" Stroke="Black" Fill="LightBlue" Opacity="0.7" /> <Rectangle Canvas.Left="40" Canvas.Top="60" Width="50" Height="50" Stroke="Black" Fill="LightBlue" Opacity="0.7" /> <Rectangle Canvas.Left="30" Canvas.Top="130" Width="50" Height="50" Stroke="Black" Fill="LightBlue" Opacity="0.7" /> </Canvas> </Window> //File:Window.xaml.cs using System; using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; namespace WpfApplication1 { public partial class HitTestExample : Window { private List<Rectangle> hitList = new List<Rectangle>(); private EllipseGeometry hitArea = new EllipseGeometry(); public HitTestExample() { InitializeComponent(); } private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { foreach (Rectangle rect in canvas1.Children) { rect.Fill = Brushes.Red; } Point pt = e.GetPosition(canvas1); hitArea = new EllipseGeometry(pt, 1.0, 1.0); hitList.Clear(); VisualTreeHelper.HitTest(canvas1, null,new HitTestResultCallback(HitTestCallback),new GeometryHitTestParameters(hitArea)); if (hitList.Count > 0) { foreach (Rectangle rect in hitList) { rect.Fill = Brushes.Blue; } Console.WriteLine("You hit " + hitList.Count.ToString() + " rectangles."); } } public HitTestResultBehavior HitTestCallback(HitTestResult result) { IntersectionDetail intersectionDetail = ((GeometryHitTestResult)result).IntersectionDetail; switch (intersectionDetail) { case IntersectionDetail.FullyContains: hitList.Add((Rectangle)result.VisualHit); return HitTestResultBehavior.Continue; case IntersectionDetail.Intersects: return HitTestResultBehavior.Continue; case IntersectionDetail.FullyInside: return HitTestResultBehavior.Continue; default: return HitTestResultBehavior.Stop; } } } }