اختبار الدخول إلى الطبقة المرئية
يوفر هذا الموضوع نظرة عامة حول عدد مرات الدخول إلى اختبار وظيفية بواسطة مرئي صواب. دعم اختبار الدخول يسمح لك تحديد ما إذا كانت توجد قيمة هندسة أو نقطة ضمن محتوى تقديمه Visual ، يسمح لك بتنفيذ واجهة المستخدم مثل مستطيل لإختيار كائنات متعددة.
يشتمل هذا الموضوع على الأقسام التالية.
- سيناريوهات اختبار الدخول.
- دعم اختبار الدخول.
- اختبار الدخول و Z-Order
- باستخدام اختبار الدخول الافتراضي.
- استخدام استدعاء نتيجة اختبار الدخول.
- استخدام مصفاة استدعاء اختبار الدخول
- تجاوز اختبار الدخول الإفتراضى.
- موضوعات ذات صلة
سيناريوهات اختبار الدخول.
الفصل UIElement يمد طريقة InputHitTest ، التى تمكنك من اختبار الدخول مقابل عنصر باستخدام احداثى معطى. فى حالالت كثيرة طريقة InputHitTest يوفر العملية المطلوبة لتنفيذ اختبار الدخول للعناصر. و مع ذلك ، هناك عدة طرق من الممكن ان تحتاجها لتنفيذ اختبار الدخول فى الطبقة المرئية.
عدد مرات الدخول إلى اختبار مقابل غير- UIElement : يتم تطبيق هذا عند إصابة اختبار غير- UIElement مثل DrawingVisual أو الرسومات .
اختبار الدخول باستخدام الهندسة. يتم تطبيقه اذا كنت تحتاج لاختبار دخول باستخدام كائن هندسى بدلا من استخدام قيمة احداثى نقطة.
اختبار الدخول لكائنات متعددة: ينطبق هذا عند الحاجةإلى اختبارالدخول إلى مقابل كائنات متعددة مثل تراكب الكائنات. يمكنك الحصول على نتائج عن كافة الشرائح المتقاطعة مع هندسة أو نقطة وليس فقط عليه أولاً.
تجاهل UIElement نهج اختبار الدخول: ينطبق هذا عندما تحتاج إلى تجاهل UIElement انهج اختبار الدخول, التى تأخذ في الاعتبار هذه العوامل مثل ما إذا كان عنصر معطل أو غير مرئى.
ملاحظة |
---|
للحصول على نموذج رموز برمجية كاملة لتوضيح اختبار الدخول إلى طبقة مرئية, راجع اختبار الدخول باستخدام نموذج شرائح مرسومة باستخدام نموذج تفاعلي مع Win32نموذج تفاعلي لاختبار الدخول صواب بإستخدام Win32 . |
دعم اختبار الدخول.
الغرض من أساليبHitTest في فئة VisualTreeHelperليحدد ما إذا كانت قيمة إحداثي هندسة أو نقطة ضمن محتوى معروض بواسطة كائن مُعطى مثل عنصر تحكم أو عنصر رسومي. على سبيل المثال، يمكنك استخدام اختبار الدخول لتحديد ما إذا كان النقر بالفأرة ضمن مستطيل إحاطة كائن يقع داخل هندسة دائرة. يمكنك أيضاً اختيار تجاوز تنفيذ اختبار الدخول الإفتراضى لإجراء عمليات حسابية الخاصة بك.
يبين الرسم التوضيحي التالي العلاقة بين منطقة الكائن الغير مستطيلة و مستطيل الإحاطة الخاص بها.
الرسم التخطيطي لناحية اختبار صالحة
اختبار الدخول و Z-Order
طبقةWindows Presentation Foundation (WPF) المرئية تدعم اختبار الدخول مقابل جميع الكائنات ضمن نقطة أو هندسة وليس فقط الكائن الأعلى. ويتم إرجاع النتائج في z-order . ومع ذلك، الكائن المرئى الذى تمرره كالمعلمة إلى أسلوب HitTest يُستخدم لتحديد أي جزء من شجرة مرئية التي سيتم عليها الاختبار. يمكنك إجراء اختبار الدخول للشجرة المرئية كاملة او جزء فيها.
في التوضيح التالي الدائرة على قمة اشكال المربع و المثلث. إذا كنت فقط مهتماً باختبار دخول الكائن المرئى الذى قيمة z-orderهى القيمة الأعلى, يمكنك تعيين تعداد اختبار الدخول المرئى لإرجاع Stop من HitTestResultCallback لإيقاف اجتياز اختبار الدخول إلى بعد العنصر الأول.
الرسم التخطيط لترتيب z لشجرة مرئية
إذا كنت تريد تعداد كافة الكائنات المرئية ضمن نقطة معينة أو هندسة ، قم بإرجاع Continue من HitTestResultCallback. وهذا يعني أنه يمكنك اختبار الدخول للكائنات المرئية الموجودة أسفل البعض صواب حتى إذا كانت جميعها محجوبة. راجع نموذج الرموز البرمجية في قسم "استخدام استدعاء اختبار الدخول" للحصول على مزيد من المعلومات.
ملاحظة |
---|
يمكن أيضاً إجراء اختبار الدخول على كائن مرئي إذا كان شفافاً. |
باستخدام اختبار الدخول الافتراضي.
يمكنك تحديد ما إذا كان نقطة داخل الهندسة للكائن المرئى باستخدام اسلوب HitTest لتحديد كائن مرئي وقيمة إحداثى نقطة لإعادة الإختبار. معلمة الكائن مرئي يحدد نقطة البداية في الشجرة المرئية لبحث اختبار الدخول. إذا تم العثور على كائن مرئي في شجرة المرئية و تحتوي هندسة الشكل على الإحداثيات يتم تعيينها إلى VisualHit خاصية الكائن HitTestResult ثم يتم إرجاعHitTestResult من الاسلوب HitTest . إذا لم تكن النقطة محتواه فى جزء فرعى فى الشجرة المرئية HitTestيتم إرجاع null.
ملاحظة |
---|
إختبار الدخول الإفتراضى دائما يقوم بارجاع الكائن الأعلى في z-order .لتحديد كافة الكائنات المرئية حتى تلك التي قد تكون جزئياً أو كليا محجوبة ، استخدم إستدعاء نتيجة إختبار الدخول. |
قيمة إحداثي التى يتم تمريرها كمعلمة للإسلوب HitTest يجب ان تكون منسوبة إلى مساحة إحداثي الكائن المرئي الذى يختبر. على سبيل المثال، إذا تم عمل تداخل للكائنات المرئية المعرفة في (100 ، 100) في مساحة إحداثي الأصل ثم اضغط اختبار تابعة مرئية في (0، 0) يساوي إصابة اختبار دخول في (100 ، 100) في مساحة إحداثي الأصل.
الرموز البرمجية التالية توضح كيفية إعداد معالجات أحداث الفأرة عن كائن UIElement الذى يُستخدم لإلتقاط الأحداث المستخدمة لاختبار الدخول.
' 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
// 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.
}
}
كيف تؤثر الشجرة المرئية على اختبار الدخول.
نقطة البداية فى الشجرة المرئية يحدد اى الكائنات التى يتم تمريرها خلال تعداد اختبار الدخول للكائنات. إذا كان لديك كائنات متعددة تريد إجراء اختبار الدخول عليها،الكائن المرئى المستخدم كنقطة بداية فى الشجرة المرئية جد مشترك لكل الكائنات. كمثال،إذا كان لديك كائنات متعددة تريد إجراء اختبار الدخول عليها،الكائن المرئى المستخدم كنقطة بداية فى الشجرة المرئية جد مشترك لكل الكائنات. فى هذه الحالة،عنصر الكنفا هو الجد المشترك لعنصر الضغط و الرسم المرئى.
الرسم التخطيطي للتسلسل الهيكلي لشجرة مرئية
ملاحظة |
---|
إن خاصية IsHitTestVisibleتحدد أو تستخرج قيمة التى تستنتج إذا كان الكائن المستمدUIElementيمكن ان يمرر كنتيجة اختبار الدخول من جزء المحتوى المقدم.هذا يمكنك من اختيار تبديل الشجرة المرئية لتحديد الكائنات المرئية المشاركة فى الاختبار. |
استخدام استدعاء نتيجة اختبار الدخول.
يمكنك سرد كل الكائنات المرئية فى الشجرة المرئية التى تحتوى هندستها على قيمة احداثى محددة. هذا يمكنك من تحديد كل الكائنات المرئية،حتى التى تكون كليا او جزئيا محجوبة بكائنات مرئية اخرى. لسرد الكائنات المرئية فى شجرة مرئية استخدم طريقة HitTestمع عملية استدعاء نتيجة اختبار الدخول. عملية استدعاء نتيجة اختبار الدخول تستخدم بواسطة النظام عندما تكون قيمة احداثى النقطة معرفة فى الكائن المرئى.
فى خلال عملية السرد ، يجب عدم اجراء عمليات تغير فى الشجرة المرئية. إضافة أو إزالة كائن من الشجرة المرئية خلال اجتيازها يمكن ان يتسبب فى سلوك غير متوقع. يمكنك اجراء تعديل فى الشجرة المرئية بعد نتيجة طريقةHitTest من الممكن ان تكون قاعدة بيانات مثل ArrayList لتسجيل قيم خلال سرد نتيجة اختبار الدخول.
' 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
// 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);
}
}
استدعاء نتيجة الاختبار تقوم بتعريف الاعمال التى يمكن القيام بها عندما يعرف اختبار الدخول على كائن محدد فى الشجرة المرئية. بعد اجراء العمليات تمرر قيمة HitTestResultBehavior التى تحدد الاستمرار فى السرد على كائنات اخرى ام لا.
' 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
// 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;
}
ملاحظة |
---|
ترتيب سرد دخول الكائنات المرئية عن طريق z-order.الكائن المرئى اعلى المستوى z-order هو اول كائن يسرد.اى كائنات اخرى تسرد على انحدار مستوى z-order هو اول كائن يسرد.هذا الترتيب للسرد يتوافق مع تقديم ترتيب المرئية. |
يمكنك ان توقف سرد الكائنات المرئية فى اى وقت فى استدعاء اختبار الدخول عن طريق Stop.
' Set the behavior to stop enumerating visuals.
Return HitTestResultBehavior.Stop
// Set the behavior to stop enumerating visuals.
return HitTestResultBehavior.Stop;
استخدام مصفاة استدعاء اختبار الدخول
يمكنك استخدام مصفاة اختبار دخول اختيارية لحصر الكائنات التى تمر لإختبار الدخول. و هذا يمكنك من اهمال جزء فى الشجرة المرئية الذى لن يجرى عليه الإختبار لإعداد مصفاة لإختبار الدخول ، يجب تعريف عملية استدعاء لإختبار الدخول و تمررها كمعلمة عندما تستدعى طريقةHitTest
' 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
// 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();
}
}
اذا كنت لا تريد ستخدام المصفاة الإختيارية لإختبار الدخول ، مرر قيمةnull كمعلمة للإسلوب HitTest
' 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.
// 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));
تهذيب شجرة مرئية.
ان مصفاة استدعاء اختبار الدخول تكمنك من سرد جميع المرئيات التى محتواها المقدم يحوى الإحداثيات التى تحددها. و مع ذلك ، من الممكن ان تتجاهل جزء معين من الشجرة المرئية التى لا تهتم بها فى عملية استدعاء نتيجة اختبار الدخول. نتيجة استدعاء اختبار الدخول تحدد ما هو العمل الذى ستقوم به الكائنات المرئية عند السرد. كمثال، اذا حصلت على قيمة ContinueSkipSelfAndChildren يمكنك ازالة الكائن المرئى الحالى و نسله من سرد نتيجة اختبار الدخول. و هذا يعنى ان نتائج استدعاء اختبار الدخول لن ترى الكائنات فى السرد. تهذيب الشجرة المرئية للكائنات يقلل من حجم العمل فى خلال سرد نتيجة اختبار الدخول. فى كود البرمجة التالى ، المصفاة تتخطى التسميات وذريتهم و تقوم باختبار كل شىء آخر.
' 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
// 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;
}
}
ملاحظة |
---|
ان مصفاة استدعاء اختبار الدخول من الممكن ان تستدعى فى بعض الحالات التى نتائج اختبار الدخول لا تستدعى فيها. |
تجاوز اختبار الدخول الإفتراضى.
يمكنك تجاوز دعم اختبار الكائنات المرئية الإفتراضى عن طريق تجاوز طريقة HitTestCore هذا يعنى ان عندما تستدعى طريقة HitTest ، ان تطبيقك الإفتراضى للإسلوب HitTestCore يتم استدعاؤه. ان طريقتك المتجاوزة تستدعى عندما يقع اختبار الدخول فى مستطيل الكائن المرئى ، حتى اذا الإحداثيات تقع خارج المحتوى المقدم من الكائن المرئى.
' 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
// 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);
}
من الممكن فى بعض الاوقات انك تريد اختبار دخول مستطيل الإحاطة و المحتوى المقدم للكائن المرئى. بإستخدام قيمة المعلمة PointHitTestParameters فى طريقة HitTestCore المتجاوزة كمعلمة للطريقة البسيطة HitTestCore ، يمكنك من اجراء اعمال اختبار الدخول على مستطيل الإحاطة للكائن المرئى ثم اجراء الإختبار مرة اخرى مقابل المحتوى المقدم من الكائن المرئى.
' 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
// 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);
}
راجع أيضًا:
المهام
كيفية القيام بما يلي: هندسة اختبار عدد مرات الدخول في Visual
كيفية القيام بما يلي: اختبار الدخول باستخدام حاوية مضيف Win32