مشاركة عبر


أتمتة UI لعنصر تحكم مخصص WPF

Microsoft UI Automation توفر واجهة واحدة معمم يمكن للعملاء التنفيذ التلقائي استخدام لفحص أو تعمل واجهات المستخدم من مجموعة متنوعة من الأنظمة الأساسية ثم الإطارات. تقومUI Automation بتمكين رمز ضمان الجودة (اختبار) وإمكانية تشغيل التطبيقات مثل قارئات الشاشة لفحص عناصر واجهة المستخدم ومحاكاة تفاعل المستخدم لهذه العناصر من تعليمات برمجية أخرى. للحصول على معلومات حول UI Automation عبر كل الأنظمة، راجع ‏إمكانية وصول ذوي الاحتياجات الخاصة.

يصف هذا الموضوع كيفية تطبيق UI Automation Provider من جانب الخادم لعنصر التحكم المخصص الذي يتم تشغيله في تطبيق WPF. يدعم WPF UI Automation من خلال شجرة كائنات التنفيذ التلقائي التى تكافىء شجرة عناصر واجهة المستخدم. يمكن أن تستخدم التعليمات البرمجية الاختبارية والتطبيقات أتمتة النظير التي توفر ميزات التشغيل مباشرة (للتعليمات البرمجية قيد التشغيل) أو من خلال واجهة عامة يوفرها UI Automation.

يشتمل هذا الموضوع على الأقسام التالية.

  • فئات التنفيذ التلقائي
  • فئات التنفيذ التلقائى المضمنة
  • اعتبارات الأمان للنظائر المشتقة
  • التنقل خلال النظائر
  • التخصيصات في النظائر المشتقة
  • موضوعات ذات صلة

فئات التنفيذ التلقائي

تدعم عناصر تحكم WPF UI Automation من خلال شجرة فئات نظيرة التي تنحدر من AutomationPeer. اصطلاحياً ، تبدأ أسماء الفئات النظيرة باسم عنصر تحكم الفئة وتنتهى بـ "AutomationPeer". على سبيل المثال، ButtonAutomationPeer هى الفئة النظيرة لفئة عنصر التحكمButton. فئات النظير مكافئة تقريباً لأنواع عنصر التحكم UI Automationولكن محددة لعناصرWPF. التعليمات البرمجية للتنفيذ التلقائي التى تقوم بالوصول إلى تطبيقات WPF من خلال واجهة UI Automation لا تدعم نظائر التنفيذ التلقائي مباشرة ولكن يمكن للتعليمات البرمجية للتنفيذ التلقائي في نفس مساحة عملية استخدام نظائر التنفيذ التلقائي مباشرة.

فئات التنفيذ التلقائى المضمنة

تطبق العناصر نظير التنفيذ التلقائي إذا كانت تقبل نشاط الواجهة من المستخدم، أو إذا كانت تحتوي على معلومات مطلوبة من قبل مستخدمي تطبيقات قارئ الشاشة. ليست كافة عناصر WPF المرئية لديها نظائر التنفيذ التلقائي. أمثلة الفئات التي تقوم بتنفيذ نظائر التنفيذ التلقائي هى Button ، TextBox ، و Label. أمثل للفئات التي لا تقوم بتنفيذ نظائر التنفيذ التلقائي هى فئات مشتقة من Decorator, مثل Border ، وفئات مبينة على Panel, مثل Grid و Canvas.

الفئة Control الأساسية ليس لها فئة نظيرة مقابلة. إذا كنت بحاجة الى فئة نظيرة لتتوافق مع عنصر تحكم مخصص مشتق من Control ، يجب اشتقاق فئة النظير المخصصة من FrameworkElementAutomationPeer.

اعتبارات الأمان للنظائر المشتقة

يجب تشغيل نظائر التنفيذ التلقائي في بيئة عمل ذات ثقة جزئية. لم يتم ضبط التعليمات البرمجية في تجميع UIAutomationClient للتشغيل في بيئة ذات ثقة جزئية والتنفيذ التلقائي للتعليمات البرمجية النظيرة يجب أن لا ترجع الى هذا التجميع. بدلاً من ذلك، يجب عليك استخدام الفئات في التجميع UIAutomationTypes. على سبيل المثال، يجب عليك استخدام الفئة AutomationElementIdentifiers من التجميع UIAutomationTypes الذي يتوافق مع الفئة AutomationElement في التجميع UIAutomationClient. من الآمن مرجعية التجميع UIAutomationTypes في التنفيذ التلقائي للتعليمات البرمجية.

التنقل خلال النظائر

بعد تحديد موقع نظير التنفيذ التلقائي، يمكن للتعليمات البرمجية قيد التشغيل التنقل في شجرة النظائر طريق استدعاء الأساليب GetChildren و GetParent الخاصة بالكائن. التنقل بين عناصر WPF داخل عنصر تحكم يتم اعتماده من قبل تطبيق النظير الخاص بالأسلوب GetChildrenCore. يقوم نظام تنفيذ UI باستدعاء هذا الأسلوب لإنشاء شجرة من العناصر الفرعية الموجودة ضمن عنصر تحكم، على سبيل المثال، عناصر القائمة في مربع قائمة. الأسلوب UIElementAutomationPeer.GetChildrenCore يقطع الشجرة المرئية للعناصر لإنشاء شجرة من نظائر التنفيذ التلقائى. عناصر التحكم المخصصة تقوم بتجاوز هذا الأسلوب لعرض عناصر تابعة لعملاء التنفيذ التلقائي وتقوم بإرجاع نظائر التنفيذ التلقائي للعناصر التي تحمل المعلومات أو تقةم بالسماح بتفاعل المستخدم.

التخصيصات في النظائر المشتقة

كافة الفئات المشتقة من UIElement و ContentElement تحتوي على الأسلوب الظاهري المحمي OnCreateAutomationPeer. يستدعي WPF OnCreateAutomationPeer للحصول على كائن نظير التنفيذ التلقائي لكل عنصر التحكم. يمكن للتعليمات البرمجية للتنفيذ التلقائي استخدام النظير للحصول على معلومات حول خصائص وميزات عنصر التحكم الخاص ولمحاكاة تفاعلية الاستخدام. عنصر التحكم المخصص الذى يدعم التنفيذ التلقائي يجب أن يتجاوز OnCreateAutomationPeer ويرجع مثيل من الفئة التي تشتق من AutomationPeer. على سبيل المثال، إذا كان عنصر التحكم المخصص يشتق من الفئة ButtonBase اذن فالكائن الذي يتم إرجاعه من قبل OnCreateAutomationPeer يجب أن ينحدر من ButtonBaseAutomationPeer.

عند تطبيق عنصر تحكم مخصص ، يجب تجاوز الأساليب "الأساسية" من الفئة النظيرة للتنفيذ التلقائي الأساسية التي تصف سلوك فريد ومحدد لعنصر التحكم المخصص الخاص بك.

تجاوز OnCreateAutomationPeer

قم بتجاوز الأسلوب OnCreateAutomationPeer لعنصر التحكم الخاص بك بحيث تقوم بإرجاع الكائن الموفر الخاص بك والذى يجب أن يشتق مباشرة أو بشكل غير مباشر من AutomationPeer.

تجاوز GetPattern

تعمل نظائر التنفيذ التلقائي على تبسيط بعض أوجه التطبيق من مدعمى جانب الخادم UI Automation ولكن لا تزال عناصر التحكم المخصصة تقوم بمعالجة نظائر التنفيذ التلقائي واجهات النقش. مثل الذين لا يوفرون WPF تدعم النظائر نقوش عناصر التحكم عن طريق توفير تطبيقات للواجهات في مساحات اسم System.Windows.Automation.Provider مثل IInvokeProvider. يمكن تطبيق نمط واجهات عنصر التحكم عن طريق النظير نفسه أو أى كائن آخر. تطبيق النظير الخاص بـ GetPattern يقوم بإرجاع كائن يدعم النمط المحدد. تدعم التعليمات البرمجية UI Automation الأسلوب GetPattern وتحدد قيمة التعداد PatternInterface. التجاوز الخاص بك لـ GetPattern يجب أن يقوم بإرجاع الكائن الذى يقوم بتنفيذ النمط المحدد. إذا كان عنصر التحكم الخاص بك ليس له تطبيق مخصص لنمط ، يمكنك استدعاء تطبيق النوع الأساسي لـ GetPattern لاسترداد اما التطبيق الخاص به أو قيمة فارغة إذا كان النمط غير مدعم من عنصر التحكم هذا. على سبيل المثال، يمكن تعيين عنصر تحكم NumericUpDown مخصص إلى قيمة ضمن نطاق ، بحيث أن النظير UI Automation الخاص به سيقوم بتطبيق واجهة IRangeValueProvider. المثال التالي يوضح كيف يتم تجاوز الأسلوب GetPattern الخاص بالنظير ليستجيل للقيمة PatternInterface.RangeValue.

        Public Overrides Function GetPattern(ByVal patternInterface As PatternInterface) As Object
            If patternInterface = PatternInterface.RangeValue Then
                Return Me
            End If
            Return MyBase.GetPattern(patternInterface)
        End Function
public override object GetPattern(PatternInterface patternInterface)
{
    if (patternInterface == PatternInterface.RangeValue)
    {
        return this;
    }
    return base.GetPattern(patternInterface);
}

يمكن أن يحدد الأسلوب GetPattern عنصر فرعي يعمل كموفر أنماط. توضح التعليمات البرمجية التالية كيف ينقل ItemsControl معالجة نمط التمرير للنظير الخاص بعنصر التحكم ScrollViewer الداخلى الخاص به.

public override object GetPattern(PatternInterface patternInterface)
{
    if (patternInterface == PatternInterface.Scroll)
    {
        ItemsControl owner = (ItemsControl) base.Owner;

        // ScrollHost is internal to the ItemsControl class
        if (owner.ScrollHost != null)
        {
            AutomationPeer peer = UIElementAutomationPeer.CreatePeerForElement(owner.ScrollHost);
            if ((peer != null) && (peer is IScrollProvider))
            {
                peer.EventsSource = this;
                return (IScrollProvider) peer;
            }
        }
    }
    return base.GetPattern(patternInterface);
}

لتحديد عنصر فرعي لمعالجة نمط، تقوم هذه التعليمات البرمجية بالحصول على الكائن الفرعي، كما تقوم بإنشاء نظير باستخدام الأسلوب CreatePeerForElement وتعين الخاصية EventsSource الخاصة بالنظير الجديد إلى النظير الحالي ثم تقوم بإرجاع نظير جديد. إعداد EventsSource على عنصر فرعي يمنع العنصر الفرعي من الظهور في شجرة نظير التنفيذ التلقائي ويقوم بتعيين كافة الأحداث بواسطة عنصر فرعي كما يتم تحديده من عنصر التحكم المحدد فى EventsSource. لا يظهر عنصر التحكم ScrollViewer في شجرة التنفيذ التلقائي وتظهر أحداث التمرير التى تقوم بإنشائها من الكائن ItemsControl.

تجاوز الأساليب "الأساسية"

تحصل التعليمات البرمجية للتنفيذ التلقائي على معلومات عنصر التحكم الخاص بك عن طريق استدعاء أساليب عامة لفئة النظير. لتوفير معلومات حول عنصر التحكم، قم بتجاوز كل أسلوب له اسم ينتهي بـ "الأساسي" عندما يختلف تطبيق عنصر التحكم الخاص بك عن تلك التي توفرها فئة نظير التنفيذ التلقائي الأساسية. كحد أدنى، يجب أن يطبق عنصر التحكم الخاص بك الأساليب GetClassNameCore و GetAutomationControlTypeCore كما هو موضح في المثال التالي.

        Protected Overrides Function GetClassNameCore() As String
            Return "NumericUpDown"
        End Function

        Protected Overrides Function GetAutomationControlTypeCore() As AutomationControlType
            Return AutomationControlType.Spinner
        End Function
protected override string GetClassNameCore()
{
    return "NumericUpDown";
}

protected override AutomationControlType GetAutomationControlTypeCore()
{
    return AutomationControlType.Spinner;
}

التطبيق الخاص بك لـ GetAutomationControlTypeCore يقوم بوصف عنصر التحكم الخاص بك وذلك بارجاع القيمة ControlType. على الرغم من أنه يمكنك ارجاع ControlType.Custom ، يجب إرجاع أحد عناصر التحكم من الأنواع الأكثر تحديداً الذى يصف بدقة عنصر التحكم الخاص بك. قيمة الإرجاع لـ ControlType.Custom تتطلب عمل إضافي للموفر لتنفيذ UI Automation ، ومنتجات العميل UI Automation غير قابلة لتوقع بنية التحكم وتفاعل لوحة المفاتيح وأنماط التحكم المحتملة.

قم بتطبيق الأساليب IsContentElementCore وIsControlElementCore للاشارة إلى ما إذا كان عنصر التحكم الخاص بك يحتوي على بيانات أو يفي بدور تفاعلي في واجهة المستخدم (أو كليهما). افتراضياً، يقوم كلا الأسلوبين بإرجاع true. تقوم هذه الاعدادات بتحسين قابلية استخدام أدوات التنفيذ التلقائي مثل قارئات الشاشة والتى قد تستخدم هذه الطرق لتصفية شجرة التنفيذ التلقائي. إذا كان الأسلوب GetPattern الخاص بك يقوم بنقل أسلوب معالجة نمط إلى نظير فرعي، يمكن أن يقوم الأسلوب IsControlElementCore الخاص بالنظير بارجاع خطأ لإخفاء النظير الفرعي من شجرة التنفيذ التلقائي. على سبيل المثال، التمرير في ListBox تتم معالجته من قبل ScrollViewer ، ونظير التنفيذ التلقائي PatternInterface.Scroll يتم ارجاعه بواسطة الأسلوب GetPattern الخاص بـ ScrollViewerAutomationPeer والمرتبط بـ ListBoxAutomationPeer.وبالتالى يقوم الأسلوب IsControlElementCore الخاص بـ ScrollViewerAutomationPeer بإرجاع false ، بحيث لا يظهر ScrollViewerAutomationPeer في شجرة التنفيذ التلقائي.

نظير التنفيذ التلقائي يجب أن يقوم بتوفير القيم الافتراضية المناسبة لعنصر التحكم الخاص بك. لاحظ أن XAML الذى يمثل مرجع لعنصر التحكم الخاص بك يمكن أن يقوم بتجاوز تطبيقات النظير الخاص بك للأساليب الأساسية بواسطة تضمين سمات AutomationProperties. على سبيل المثال، تقوم XAML التالية بإنشاء زر له خاصيتين UI Automation مخصصتين.

<Button AutomationProperties.Name="Special" 
    AutomationProperties.HelpText="This is a special button."/>

تطبيق موفري نمط

يتم بشكل صريح تعريف الواجهات المطبقة بواسطة موفر مخصص إذا كان العنصر المالك يشتق مباشرة من Control. على سبيل المثال، تقوم التعليمات البرمجية التالية بتعريف نظير لـ Control التي تطبق نطاق قيمة.

public class RangePeer1 : FrameworkElementAutomationPeer, IRangeValueProvider { }

إذا كان عنصر التحكم المالك يشتق من نوع معين من عناصر التحكم مثل RangeBase ، يمكن اشتقاق النظير من فئة نظيرة مكافئة مشتقة في هذه الحالة، قد يقوم النظير باشتقاق من RangeBaseAutomationPeer ، الذي يوفر تطبيق أساسي لـ IRangeValueProvider. تظهر التعليمات البرمجية التالية تصريح لمثل هذا النظير.

public class RangePeer2 : RangeBaseAutomationPeer { }

للحصول على تطبيق مثال ، راجع NumericUpDown Custom Control with Theme and UI Automation Support Sample .

بدء تشغيل أحداث

يمكن اشتراك عملاء التنفيذ التلقائي فى أحداث التنفيذ التلقائي. يجب على عناصر التحكم المخصصة أن ترسل تقرير عن التغييرات في حالة التحكم بواسطة استدعاء الأسلوب RaiseAutomationEvent. وبالمثل، عندما تتغير قيمة خاصية قم باستدعاء الأسلوب RaisePropertyChangedEvent. تُظهر التعليمات البرمجية التالية كيفية الحصول على كائن نظير من ضمن التعليمات البرمجية لعنصر التحكم واستدعاء أسلوب لبدء تشغيل حدث. لجعل الأداء مثالى، تحدد التعليمات البرمجية ما إذا كان هناك أي مستمعين لهذا النوع من الأحداث. اجراء تشغيل للحدث فقط عند وجود مستمعين يعمل على تجنب أى حمل غير ضروري ويساعد عنصر التحكم على البقاء قابل للاستجابة.

            If AutomationPeer.ListenerExists(AutomationEvents.PropertyChanged) Then
                Dim peer As NumericUpDownAutomationPeer = TryCast(UIElementAutomationPeer.FromElement(nudCtrl), NumericUpDownAutomationPeer)

                If peer IsNot Nothing Then
                    peer.RaisePropertyChangedEvent(RangeValuePatternIdentifiers.ValueProperty, CDbl(oldValue), CDbl(newValue))
                End If
            End If
if (AutomationPeer.ListenerExists(AutomationEvents.PropertyChanged))
{
    NumericUpDownAutomationPeer peer = 
        UIElementAutomationPeer.FromElement(nudCtrl) as NumericUpDownAutomationPeer;

    if (peer != null)
    {
        peer.RaisePropertyChangedEvent(
            RangeValuePatternIdentifiers.ValueProperty,
            (double)oldValue,
            (double)newValue);
    }
}

راجع أيضًا:

المهام

نموذج اختبار أعضاء البيانات مولد

المبادئ

نظرة عامة حول واجهة المستخدم التنفيذ التلقائي

تطبيق موفر التنفيذ التلقائي واجهة المستخدم من جانب الخادم

موارد أخرى

نموذج عنصر التحكم المخصص NumericUpDown مع نمط ودعم واجهة تنفيذ تلقائى

محفوظات التغيير

التاريخ

المحفوظات

السبب

يوليو 2008

المواضيع المضافة.

تحسين المعلومات.