Mega Code Archive

 
Categories / C# / WPF
 

Hit Result Behavior

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