<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.vb
Imports System
Imports System.Collections.Generic
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Input
Imports System.Windows.Media
Imports System.Windows.Shapes
Namespace WpfApplication1
Public Partial Class HitTestExample
Inherits Window
Private hitList As New List(Of Rectangle)()
Private hitArea As New EllipseGeometry()
Public Sub New()
InitializeComponent()
End Sub
Private Overloads Sub OnMouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
For Each rect As Rectangle In canvas1.Children
rect.Fill = Brushes.Red
Next
Dim pt As Point = e.GetPosition(canvas1)
hitArea = New EllipseGeometry(pt, 1.0, 1.0)
hitList.Clear()
VisualTreeHelper.HitTest(canvas1, Nothing, New HitTestResultCallback(AddressOf HitTestCallback), New GeometryHitTestParameters(hitArea))
If hitList.Count > 0 Then
For Each rect As Rectangle In hitList
rect.Fill = Brushes.Blue
Next
Console.WriteLine("You hit " & hitList.Count.ToString() & " rectangles.")
End If
End Sub
Public Function HitTestCallback(result As HitTestResult) As HitTestResultBehavior
Dim intersectionDetail__1 As IntersectionDetail = DirectCast(result, GeometryHitTestResult).IntersectionDetail
Select Case intersectionDetail__1
Case IntersectionDetail.FullyContains
hitList.Add(DirectCast(result.VisualHit, Rectangle))
Return HitTestResultBehavior.[Continue]
Case IntersectionDetail.Intersects
Return HitTestResultBehavior.[Continue]
Case IntersectionDetail.FullyInside
Return HitTestResultBehavior.[Continue]
Case Else
Return HitTestResultBehavior.[Stop]
End Select
End Function
End Class
End Namespace
|