Görsel Katmanda Tıklama Testi
Bu konu, görsel katmanı tarafından sağlanan isabet testi işlevselliğine genel bir bakış sağlar. Isabet testi desteği, bir geometrinin veya nokta değerinin bir öğesinin işlenmiş içeriğine denk olup olmadığını belirlemenize olanak sağlar ve seçim dikdörtgeni gibi kullanıcı arabirimi davranışını birden çok nesne seçmenize Visual olanak sağlar.
Isabet Testi Senaryoları
sınıfı, UIElement belirli bir koordinat değerini kullanarak bir InputHitTest öğeye karşı teste isabet etmek için yöntemini sağlar. Çoğu durumda yöntemi, InputHitTest öğelerin isabet testlerini uygulamak için istenen işlevselliği sağlar. Bununla birlikte, görsel katmanında isabet testi uygulamanız gereken birkaç senaryo vardır.
Nesne olmayan nesnelere karşı isabet testi: Veya grafik nesneleri gibi olmayan nesneleri test UIElementUIElement edersiniz. DrawingVisual
Geometri kullanarak isabet testi: Bu, bir noktanın koordinat değeri yerine geometri nesnesi kullanarak teste isabet etmek için geçerlidir.
Birden çok nesne için isabet testi: Çakışan nesneler gibi birden çok nesnede teste isabet etmek için bu durum geçerlidir. Yalnızca birinciyi değil, bir geometriyi veya noktayı kesişen tüm görseller için sonuçlar elde edin.
Isabet testi ilkesi yoksayma: Bu durum, bir öğenin devre dışı mı yoksa görünmez mi olduğu gibi faktörleri dikkate alan isabet testi ilkesi UIElementUIElement yoksaymak için geçerlidir.
Not
Görsel katmanda isabet testinin yer alan tam bir kod örneği için bkz. DrawingVisuals Kullanarak Isabet Testi Ve Win32 BirlikteÇalışma Örneği ile Isabet Testi.
Hit Test Desteği
sınıfındaki yöntemlerin amacı, bir geometri veya nokta koordinat değerinin, denetim veya grafik öğesi gibi belirli bir nesnenin işlenmiş içeriği içinde olup HitTestVisualTreeHelper olmadığını belirlemektir. Örneğin, bir nesnenin sınırlayıcı dikdörtgeni içindeki bir fare tıklamanın bir dairenin geometrisi içinde olup olmadığını belirlemek için isabet testi kullanabilirsiniz. Kendi özel isabet testi hesaplamalarınızı gerçekleştirmek için isabet testinin varsayılan uygulamasını geçersiz kılmayı da seçebilirsiniz.
Aşağıdaki çizimde dikdörtgen olmayan bir nesnenin bölgesi ile sınırlayıcı dikdörtgeni arasındaki ilişki gösterilmiştir.

Geçerli isabet testi bölgesi diyagramı
Hit Testing ve Z-Order
Windows Presentation Foundation (WPF) görsel katmanı yalnızca en üst düzey nesneyi değil, bir nokta veya geometri altındaki tüm nesnelere karşı isabet testlerini destekler. Sonuçlar z sırasıyla döndürülür. Ancak yöntemine parametresi olarak geçişini görsel nesne test isabet görsel ağacı HitTest hangi bölümünü belirler. Görsel ağacın tamamına veya herhangi bir bölümüne karşı teste isabet siniz.
Aşağıdaki çizimde daire nesnesi hem kare hem de üçgen nesnelerin üzerindedir. Yalnızca z sırası değeri en yüksek olan görsel nesnesinin isabet testiyle ilgileniyorsanız, ilk öğeden sonra isabet testi geçişini durdurmak için görsel isabet testi numaralama değerini öğesinden geri dönecek şekilde StopHitTestResultCallback ayarlayın.

Görsel ağacın z düzeni diyagramı
Belirli bir nokta veya geometri altındaki tüm görsel nesneleri numaralara almak için , 'den Continue geri HitTestResultCallback döner. Başka bir ifadeyle, tamamen gizli olsalar bile diğer nesnelerin altındaki görsel nesneler için teste isabet edersiniz. Daha fazla bilgi için "Hit Test Sonuçları Callback kullanma" bölümündeki örnek koda bakın.
Not
Saydam bir görsel nesnesine isabet testi de olabilir.
Varsayılan Isabet Testi Kullanma
Bir noktanın görsel nesnenin geometrisi içinde olup olmadığını belirlemek için, bir görsel nesnesi ve test etmek için bir nokta koordinat değeri belirtmek için HitTest yöntemini kullanabilirsiniz. Görsel nesne parametresi, isabet testi araması için görsel ağacında başlangıç noktasını tanımlar. Geometrisi koordinatı içeren görsel bir nesne görsel ağacında bulunursa, bir nesnenin VisualHit özelliğine HitTestResult ayarlanır. HitTestResultDaha sonra yönteminden HitTest döndürülür. Nokta görsel alt ağacıyla birlikte yoksa teste isabet ediyorsanız HitTestnull döndürür.
Not
Varsayılan isabet testi her zaman z düzeninde en üst sırada olan nesneyi döndürür. Kısmen veya tamamen gizli olanlar da olmak üzere tüm görsel nesneleri tanımlamak için bir isabet testi sonucu geri çağırma kullanın.
yöntemi için nokta parametresi olarak geçiş koordinat değerinin, test etmek istediğiniz görsel nesnesinin koordinat HitTest alanıyla göreli olması gerekir. Örneğin, üst öğenin koordinat boşluğunda (100, 100) tanımlı iç içe görsel nesneler varsa, alt görselin (0, 0) üzerinde test edilmesi, üst öğenin koordinat boşluğunda (100, 100) isabet testiyle eşdeğerdir.
Aşağıdaki kod, isabet testi için kullanılan olayları yakalamak için kullanılan bir nesne için fare olayı UIElement işleyicilerini ayarlamayı gösterir.
// Respond to the left mouse button down event by initiating the hit test.
private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// Retrieve the coordinate of the mouse position.
Point pt = e.GetPosition((UIElement)sender);
// Perform the hit test against a given portion of the visual object tree.
HitTestResult result = VisualTreeHelper.HitTest(myCanvas, pt);
if (result != null)
{
// Perform action on hit visual object.
}
}
' Respond to the left mouse button down event by initiating the hit test.
Private Overloads Sub OnMouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
' Retrieve the coordinate of the mouse position.
Dim pt As Point = e.GetPosition(CType(sender, UIElement))
' Perform the hit test against a given portion of the visual object tree.
Dim result As HitTestResult = VisualTreeHelper.HitTest(myCanvas, pt)
If result IsNot Nothing Then
' Perform action on hit visual object.
End If
End Sub
Görsel Ağacın Isabet Testlerini EtkilemeSi
Görsel ağaçtaki başlangıç noktası, nesnelerin isabet testi numaralandırı sırasında hangi nesnelerin döndürüleceklerini belirler. Teste isabet etmek istediğiniz birden çok nesne varsa, görsel ağacında başlangıç noktası olarak kullanılan görsel nesne, tüm ilgi nesnelerinin ortak üst bilgisi olması gerekir. Örneğin, hem düğme öğesini test etmek hem de aşağıdaki diyagramda görsel çizmekle ilgileniyorsanız, görsel ağacının başlangıç noktasını her ikisinin ortak üst öğesi olarak ayarlamanız gerekir. Bu durumda tuval öğesi, hem düğme öğesinin hem de çizim görselinin ortak üst öğesidir.

Görsel ağaç hiyerarşisi diyagramı
Not
özelliği, türetilmiş bir nesnenin işlenmiş içeriğinin bir kısmının isabet testi sonucu olarak döndürülip döndürülelene olmadığını bildiren bir değer alır IsHitTestVisibleUIElement veya ayarlar. Bu, isabet testinde hangi görsel nesnelerin yer alan olduğunu belirlemek için görsel ağacı seçmeli olarak değiştirmene olanak sağlar.
IsabetLi Test Sonucu Geri Çağırma Kullanma
Geometrisi belirli bir koordinat değeri içeren bir görsel ağaçtaki tüm görsel nesneleri numaralara ebilirsiniz. Bu, kısmen veya diğer görsel nesneler tarafından tamamen gizli olan tüm görsel nesneleri tanımlamanıza olanak sağlar. Görsel ağaçtaki görsel nesnelerinin numaralarını aramak için hit test geri çağırma HitTest işleviyle yöntemini kullanın. Belirttiğiniz koordinat değeri bir görsel nesnesinde yer alan isabet testi geri çağırma işlevi sistem tarafından çağrılır.
Isabet testi sonuçları numaralama sırasında, görsel ağacı değiştiren hiçbir işlem gerçekleştirmeniz gerekir. Bir nesnenin geçiş sırasında görsel ağaçtan kaldırılması veya kaldırılması öngörülemeyen davranışlara neden olabilir. Yöntem döndürdikten sonra görsel ağacı güvenli bir şekilde HitTest değiştirebilirsiniz. Isabet testi sonuçları numaralama sırasında değerleri depolamak için gibi bir veri ArrayList yapısı sağlamak istiyor olabilir.
// Respond to the right mouse button down event by setting up a hit test results callback.
private void OnMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
// Retrieve the coordinate of the mouse position.
Point pt = e.GetPosition((UIElement)sender);
// Clear the contents of the list used for hit test results.
hitResultsList.Clear();
// Set up a callback to receive the hit test result enumeration.
VisualTreeHelper.HitTest(myCanvas, null,
new HitTestResultCallback(MyHitTestResult),
new PointHitTestParameters(pt));
// Perform actions on the hit test results list.
if (hitResultsList.Count > 0)
{
Console.WriteLine("Number of Visuals Hit: " + hitResultsList.Count);
}
}
' Respond to the right mouse button down event by setting up a hit test results callback.
Private Overloads Sub OnMouseRightButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
' Retrieve the coordinate of the mouse position.
Dim pt As Point = e.GetPosition(CType(sender, UIElement))
' Clear the contents of the list used for hit test results.
hitResultsList.Clear()
' Set up a callback to receive the hit test result enumeration.
VisualTreeHelper.HitTest(myCanvas, Nothing, New HitTestResultCallback(AddressOf MyHitTestResult), New PointHitTestParameters(pt))
' Perform actions on the hit test results list.
If hitResultsList.Count > 0 Then
Console.WriteLine("Number of Visuals Hit: " & hitResultsList.Count)
End If
End Sub
Isabet testi geri çağırma yöntemi, görsel ağacının belirli bir görsel nesnesinde isabet testi tanımladığı zaman gerçekleştirecekleri eylemleri tanımlar. Eylemleri gerçekleştirdikten sonra, başka bir görsel nesne için numaralama işleminin devam edip HitTestResultBehavior edeceğini belirleyen bir değer geri dönersiniz.
// Return the result of the hit test to the callback.
public HitTestResultBehavior MyHitTestResult(HitTestResult result)
{
// Add the hit test result to the list that will be processed after the enumeration.
hitResultsList.Add(result.VisualHit);
// Set the behavior to return visuals at all z-order levels.
return HitTestResultBehavior.Continue;
}
' Return the result of the hit test to the callback.
Public Function MyHitTestResult(ByVal result As HitTestResult) As HitTestResultBehavior
' Add the hit test result to the list that will be processed after the enumeration.
hitResultsList.Add(result.VisualHit)
' Set the behavior to return visuals at all z-order levels.
Return HitTestResultBehavior.Continue
End Function
Not
Isabetli görsel nesnelerinin numaralama sırası z düzenine göredir. En üst z sırası düzeyindeki görsel nesnesi, numaralandı ilk nesnedir. Numaralandı olan diğer görsel nesneler z sırası düzeyinde azalan düzeydedir. Bu numaralama sırası, görsellerin işleme sırasına karşılık gelen bir sıralamadır.
döndürerek isabet testi geri çağırma işlevinde herhangi bir zamanda görsel nesnelerin numaralamasını Stop durdurabilirsiniz.
// Set the behavior to stop enumerating visuals.
return HitTestResultBehavior.Stop;
' Set the behavior to stop enumerating visuals.
Return HitTestResultBehavior.Stop
IsabetLi Test Filtresi Geri Çağırma Kullanma
Üzerinde isabet testi sonuçlarına geçirilen nesneleri kısıtlamak için isteğe bağlı bir isabet testi filtresi kullanabilirsiniz. Bu, isabet testi sonuçlarınızı işlemeyle ilgilenmezsiniz görsel ağacının bölümlerini yoksaymanıza olanak sağlar. Bir isabet testi filtresi uygulamak için bir isabet testi filtresi geri çağırma işlevi tanımlar ve yöntemini çağırarak parametre değeri olarak HitTest geçirebilirsiniz.
// Respond to the mouse wheel event by setting up a hit test filter and results enumeration.
private void OnMouseWheel(object sender, MouseWheelEventArgs e)
{
// Retrieve the coordinate of the mouse position.
Point pt = e.GetPosition((UIElement)sender);
// Clear the contents of the list used for hit test results.
hitResultsList.Clear();
// Set up a callback to receive the hit test result enumeration.
VisualTreeHelper.HitTest(myCanvas,
new HitTestFilterCallback(MyHitTestFilter),
new HitTestResultCallback(MyHitTestResult),
new PointHitTestParameters(pt));
// Perform actions on the hit test results list.
if (hitResultsList.Count > 0)
{
ProcessHitTestResultsList();
}
}
' Respond to the mouse wheel event by setting up a hit test filter and results enumeration.
Private Overloads Sub OnMouseWheel(ByVal sender As Object, ByVal e As MouseWheelEventArgs)
' Retrieve the coordinate of the mouse position.
Dim pt As Point = e.GetPosition(CType(sender, UIElement))
' Clear the contents of the list used for hit test results.
hitResultsList.Clear()
' Set up a callback to receive the hit test result enumeration.
VisualTreeHelper.HitTest(myCanvas, New HitTestFilterCallback(AddressOf MyHitTestFilter), New HitTestResultCallback(AddressOf MyHitTestResult), New PointHitTestParameters(pt))
' Perform actions on the hit test results list.
If hitResultsList.Count > 0 Then
ProcessHitTestResultsList()
End If
End Sub
İsteğe bağlı isabetli test filtresi geri çağırma işlevini sağlamak istemiyorsanız, yöntemi null için parametresi olarak bir değer HitTest girin.
// Set up a callback to receive the hit test result enumeration,
// but no hit test filter enumeration.
VisualTreeHelper.HitTest(myCanvas,
null, // No hit test filtering.
new HitTestResultCallback(MyHitTestResult),
new PointHitTestParameters(pt));
' Set up a callback to receive the hit test result enumeration,
' but no hit test filter enumeration.
VisualTreeHelper.HitTest(myCanvas, Nothing, New HitTestResultCallback(AddressOf MyHitTestResult), New PointHitTestParameters(pt)) ' No hit test filtering.

Görsel ağacı ayıklama
Isabetli test filtresi geri çağırma işlevi, işlenen içeriği belirttiğiniz koordinatları içeren tüm görselleri numara olarak belirtmenize olanak sağlar. Ancak, isabet testi sonuçları geri çağırma işlevinde işlemeyle ilgilenmeniz gereken görsel ağacın belirli dallarını yoksayabilirsiniz. Isabet testi filtresi geri çağırma işlevinin dönüş değeri, görsel nesnelerinin numaralama işlemi için hangi tür eylemin gerektiğini belirler. Örneğin, değeri olarak geri dönersiniz, geçerli görsel nesnesini ve bu nesnenin arkasını ContinueSkipSelfAndChildren isabet testi sonuçları numaralama değerinden kaldırabilirsiniz. Bu, isabetli test sonuçları geri çağırma işlevinin bu nesneleri numaralamada görmeyecek olduğu anlamına gelir. Nesnelerin görsel ağacını ayıklamak, isabet testi sonuçları numaralama geçişi sırasında işleme miktarını azaltıyor. Aşağıdaki kod örneğinde, filtre etiketleri ve altlarını atlar ve diğer tüm testlere isabet ediyor.
// Filter the hit test values for each object in the enumeration.
public HitTestFilterBehavior MyHitTestFilter(DependencyObject o)
{
// Test for the object value you want to filter.
if (o.GetType() == typeof(Label))
{
// Visual object and descendants are NOT part of hit test results enumeration.
return HitTestFilterBehavior.ContinueSkipSelfAndChildren;
}
else
{
// Visual object is part of hit test results enumeration.
return HitTestFilterBehavior.Continue;
}
}
' Filter the hit test values for each object in the enumeration.
Public Function MyHitTestFilter(ByVal o As DependencyObject) As HitTestFilterBehavior
' Test for the object value you want to filter.
If o.GetType() Is GetType(Label) Then
' Visual object and descendants are NOT part of hit test results enumeration.
Return HitTestFilterBehavior.ContinueSkipSelfAndChildren
Else
' Visual object is part of hit test results enumeration.
Return HitTestFilterBehavior.Continue
End If
End Function
Not
Isabetli test sonuçları geri çağırmanın çağrılmaytığı durumlarda bazen isabet testi filtresi geri çağırması çağrılır.
Varsayılan Isabet Testlerini Geçersiz Kılma
yöntemini geçersiz kılarak görsel nesnesinin varsayılan isabet testi desteğini geçersiz HitTestCore kılabilirsiniz. Başka bir ifadeyle yöntemini HitTest çağırarak geçersiz kılınan uygulamasının çağrılmış HitTestCore olduğu anlamına gelir. Geçersiz kılınan yönteminiz, koordinat görsel nesnesinin işlenmiş içeriğinin dışına düşse bile bir isabet testi görsel nesnesinin sınırlayıcı dikdörtgeni içinde olduğunda çağrılır.
// Override default hit test support in visual object.
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
Point pt = hitTestParameters.HitPoint;
// Perform custom actions during the hit test processing,
// which may include verifying that the point actually
// falls within the rendered content of the visual.
// Return hit on bounding rectangle of visual object.
return new PointHitTestResult(this, pt);
}
' Override default hit test support in visual object.
Protected Overrides Overloads Function HitTestCore(ByVal hitTestParameters As PointHitTestParameters) As HitTestResult
Dim pt As Point = hitTestParameters.HitPoint
' Perform custom actions during the hit test processing,
' which may include verifying that the point actually
' falls within the rendered content of the visual.
' Return hit on bounding rectangle of visual object.
Return New PointHitTestResult(Me, pt)
End Function
Bir görsel nesnesinin hem sınırlayıcı dikdörtgeni hem de işlenmiş içeriğini test etmek istediğiniz zamanlar olabilir. Geçersiz kılınan yönteminizin parametre değerini temel yönteminde parametresi olarak kullanarak, bir görsel nesnesinin sınırlayıcı dikdörtgeni isabetini temel alan eylemler gerçekleştirebilirsiniz ve ardından görsel nesnesinin işlenmiş içeriğine karşı ikinci bir PointHitTestParametersHitTestCore isabet testi HitTestCore gerçekleştirebilirsiniz.
// Override default hit test support in visual object.
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
// Perform actions based on hit test of bounding rectangle.
// ...
// Return results of base class hit testing,
// which only returns hit on the geometry of visual objects.
return base.HitTestCore(hitTestParameters);
}
' Override default hit test support in visual object.
Protected Overrides Overloads Function HitTestCore(ByVal hitTestParameters As PointHitTestParameters) As HitTestResult
' Perform actions based on hit test of bounding rectangle.
' ...
' Return results of base class hit testing,
' which only returns hit on the geometry of visual objects.
Return MyBase.HitTestCore(hitTestParameters)
End Function