مشاركة عبر


نظرة عامة حول المدخلات

Windows Presentation Foundation (WPF)يوفر نظام فرعي قوة APIللحصول على إدخال من مجموعة متنوعة من الأجهزة، بما فيها ماوس، لوحة المفاتيح، اللمس، وابرة الفونوغراف. يصف هذا الموضوع الخدمات الموفرة من قبل WPFويشرح هندسة أنظمة الإدخال.

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

  • إدخال API
  • توجيه الحدث
  • معالجة أحداث الإدخال
  • إدخال النصوص
  • اللمس و المعالجة البارعة
  • التركيز
  • موضع الماوس
  • التقاط الماوس
  • الأوامر
  • نظام الإدخال و العناصر الأساسية
  • وماذا بعد
  • موضوعات ذات صلة

إدخال API

الإدخال الأساسي API يتم عرضه على فئات العنصر الأساسي : UIElement و ContentElement وFrameworkElement و FrameworkContentElement. للحصول على معلومات إضافية حول العناصر الأساسية راجع نظرة عامة حول العناصر الأساسية. توفر هذه الفئات وظائف لأحداث الإدخال متعلقة بضغط المفتاح للتشغيل و أزرار الماوس, عجلة الماوس, حركة الماوس, إدارة التركيز و التقاط الماوس,هذا لتسمية القليل. عن طريق وضع الإدخال API على العناصر الأساسية بدلاً من معالجتها مثل كافة الأحداث كخدمة، يمكّن أسلوب بناء الإدخال توريد أحداث الإدخال بواسطة كائن معين في واجهة المستخدم و يدعم نظام توجيه الحدث الذي يمكّن أكثر من عنصر واحد فرصة لمعالجة حدث الإدخال. تحتوي العديد من أحداث الإدخال علي زوج من الأحداث المرتبطة بها. على سبيل المثال، حدث المفتاح لأسفل مقترن بأحداث KeyDown و PreviewKeyDown . يتمثل الاختلاف في هذه الأحداث في كيفية توجيهها للعنصر الهدف. معاينة الأحداث تسير أسفل شجرة العنصر من العنصر الجذر إلى العنصر الهدف. الأحداث الفقاعية تسير لأعلى من العنصر الهدف إلى العنصر الجذر. توجيه الأحداث في WPF يتم مناقشته بمزيد من التفصيل فيما بعد في هذه النظرة العامة و في نظرة عامة حول الأحداث الموجهة.

فئات الماوس ولوحة المفاتيح

بالإضافة إلى الإدخال API على فئات العنصر الأساسي, فئة Keyboard و فئات Mouse توفر API إضافية لاستخدام لوحة المفاتيح والماوس للإدخال.

أمثلة الإدخال API على Keyboard فئة Modifiers الخاصية التي تقوم بإرجاع ModifierKeys المضغوط حالياً و IsKeyDown الأسلوب الذي يحدد ما إذا كان المفتاح المحدد مضغوط.

يستخدم المثال التالي GetKeyStates أسلوب لتحديد ما إذا كان Key في حالة الأسفل.

            ' Uses the Keyboard.GetKeyStates to determine if a key is down.
            ' A bitwise AND operation is used in the comparison. 
            ' e is an instance of KeyEventArgs.
            If (Keyboard.GetKeyStates(Key.Return) And KeyStates.Down) > 0 Then
                btnNone.Background = Brushes.Red
// Uses the Keyboard.GetKeyStates to determine if a key is down.
// A bitwise AND operation is used in the comparison. 
// e is an instance of KeyEventArgs.
if ((Keyboard.GetKeyStates(Key.Return) & KeyStates.Down) > 0)
{
    btnNone.Background = Brushes.Red;
}

أمثلة الإدخال API على Mouse فئة MiddleButton ، الذي يحصل على الحالة من زر الماوس الأوسط و DirectlyOver الذي يحصل على العنصر الذي يشير إليه الماوس حالياً.

يحدد المثال التالي ما إذا كان LeftButton على الماوس هو في Pressed حالة.

            If Mouse.LeftButton = MouseButtonState.Pressed Then
                UpdateSampleResults("Left Button Pressed")
            End If
if (Mouse.LeftButton == MouseButtonState.Pressed)
{
    UpdateSampleResults("Left Button Pressed");
}

فئاتMouse و Keyboard يتم تغطيتها بتفاصيل أكتر خلال هذه النظرة العامة .

إدخال ‏‫إبرة الفونوغراف‬

WPF لديها دعم متكامل لStylus. Stylusهو إدخال قلم إجراء شهرة بواسطة كمبيوتر لوحي. WPFيمكنك التعامل مع التطبيقات القلم ماوس باستخدام الماوسAPI، ولكنWPFأيضا الكشف عن تجريد الأجهزة إبرة الفونوغراف والتي تستخدم طراز مشابه إلى لوحة مفاتيح أو ماوس. كافة واجهات API المتعلقة بإبرة الفونوغراف‬ تحتوي على كلمة "إبرة الفونوغراف".

لأن يمكن استخدام إبرة الفونوغراف كماوس, التطبيقات التي تدعم إدخال الماوس فقط لا يزال يمكنها الحصول على بعض الدعم من إبرة الفونوغراف تلقائياً. عند استخدام إبرة الفونوغراف بهذه الطريقة, يعطى التطبيق الفرصة لمعالجة حدث إبرة الفونوغراف المناسبة ومن ثم يعالج الحدث المطابق للماوس. ‏‫بالإضافة، الخدمات العالية المستوى مثل إدخال الحبر تتوفر أيضاً من خلال جهاز إبرة الفونوغراف المجردة للحصول على مزيد من المعلومات حول الحبر كـ صواب ، راجع الشروع في استخدام الحبر.

توجيه الحدث

FrameworkElement يمكن أن تحتوي على عناصر أخرى مثل العناصر التابعة في طراز المحتوى الخاص به, بحيث يتم تشكيل شجرة من العناصر. في WPF ، يشارك العنصر الأصل في توجيه الإدخال إلى العناصر التابعة له أو التوابع الأخرى بتسليم الأحداث. يكون هذا مفيداً بشكل خاص لإنشاء عناصر تحكم من عناصر تحكم أصغر, هذه عملية تُعرف باسم "تركيب عنصر التحكم" أو " التركيب ". للحصول على مزيد من المعلومات حول أشجار العنصر و كيفية ربط أشجار العنصر مع توجيهات الحدث, راجع الأشجار فى الWPF.

توجيه الحدث هي عملية إعادة توجيه الأحداث لعديد من العناصر بحيث يمكن لكائن معين أو عنصر أثناء التوجيه اختيار استجابة هامة (من خلال معالجة) إلى حدث قد يكون تم توريده من قبل عنصر آخر. الأحداث الموجهة تستخدم إحدى ثلاث آليات التوجيه الآتية : توجيه,‏‫ اتصال فقاعي, ‏‫اتصال نفقي‬. في التوجيه المباشر, العنصر المصدر هو فقط العنصر الذي يتم إعلامه, و لا يتم توجيه الحدث إلى أية عناصر أخرى. ومع ذلك، الأحداث الموجهة مباشرة لا تزال تقدم بعض القدرات الإضافية الموجودة فقط للأحداث الموجهة مقابل تلك CLR للأحداث القياسية. الاتصال الفقاعي يعمل في شجرة العنصر عن طريق إعلام العنصر الذي ورد الحدث أولا ثم العنصر الأصل وهكذا. الاتصال النفقي يبدأ عند جذر شجرة العنصر ويعمل لأسفل حتى العنصر المصدر الأصلي. للحصول على المزيد من المعلومات عن الأحداث الموجهة، راجع نظرة عامة حول الأحداث الموجهة.

WPF تأتي الأحداث المدخلة بشكل عام في أزواج تتكون من حدث النفق ثم حدث الاتصال الفقاعي. يتم تمييز أحداث النفق عن أحداث الاتصال الفقاعي بالبادئة "معاينة". على سبيل المثال، PreviewMouseMove هو إصدار النفق من حدث نقل الماوس و MouseMove هو إصدار الاتصال الفقاعي من هذا الحدث. ازدواج الحدث هو اصطلاح يتم تطبيقه في مستوى العنصر و ليس قدرات متأصلة في WPF نظام الأحداث. للحصول على التفاصيل، راجع مقطع أحداث الإدخال WPF في نظرة عامة حول الأحداث الموجهة.

معالجة أحداث الإدخال

لاستلام إدخال على عنصر, يجب أن يكون معالج الأحداث مقترن مع ذلك الحدث المعين. في XAML هذا مباشر: يرجع اسم الحدث إلى سمة العنصر الذي سوف يستمع لهذا الحدث. ثم قم بتعيين قيمة السمة لاسم معالج الأحداث الذي تقوم بتعريفه استناداً إلى المفوض. يجب كتابة معالج الأحداث في التعليمة البرمجية مثل #C و يمكن تضمينها في الملفات الخلفية للتعليمات البرمجية.

تحدث أحداث لوحة المفاتيح عندما يقرر نظام التشغيل مفتاح الإجراءات التي تحدث أثناء تركيز لوحة المفاتيح على عنصر. ينقسم الماوس و أحداث إبرة الفونوغراف‬ إلى فئتين: الأحداث التي تقرر التغيير في موضع المؤشر نسبة إلى العنصر والأحداث التي تقرر التغيير في حالة أزرار الجهاز.

مثال لحدث إدخال في لوحة المفاتيح

يستمع المثال التالي لـ اضغط مفتاح السهم الأيسر. StackPanel يتم إنشاءه, الذي يحتوي على Button. معالج الأحداث للإصغاء لـ اضغط مفتاح السهم الأيسر مرفقة بالمثيل Button .

المقطع الأول للمثال ينشئ StackPanel و Button و يصل معالج الحدث KeyDown.

<StackPanel>
  <Button Background="AliceBlue"
          KeyDown="OnButtonKeyDown"
          Content="Button1"/>
</StackPanel>
            ' Create the UI elements.
            Dim keyboardStackPanel As New StackPanel()
            Dim keyboardButton1 As New Button()

            ' Set properties on Buttons.
            keyboardButton1.Background = Brushes.AliceBlue
            keyboardButton1.Content = "Button 1"

            ' Attach Buttons to StackPanel.
            keyboardStackPanel.Children.Add(keyboardButton1)

            ' Attach event handler.
            AddHandler keyboardButton1.KeyDown, AddressOf OnButtonKeyDown
// Create the UI elements.
StackPanel keyboardStackPanel = new StackPanel();
Button keyboardButton1 = new Button();

// Set properties on Buttons.
keyboardButton1.Background = Brushes.AliceBlue;
keyboardButton1.Content = "Button 1";

// Attach Buttons to StackPanel.
keyboardStackPanel.Children.Add(keyboardButton1);

// Attach event handler.
keyboardButton1.KeyDown += new KeyEventHandler(OnButtonKeyDown);

المقطع الثاني يتم كتابته بالتعليمات البرمجية و يقوم بتعريف معالج الأحداث. عند الضغط على مفتاح السهم الأيسر و تركيز لوحة المفاتيح Button يتم تشغيل المعالج و Background لون Button يتغير. إذا تم الضغط على المفتاح ولكنه ليس مفتاح السهم الأيسر Background لون Button يتغير إلى لون البداية.

        Private Sub OnButtonKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
            Dim source As Button = TryCast(e.Source, Button)
            If source IsNot Nothing Then
                If e.Key = Key.Left Then
                    source.Background = Brushes.LemonChiffon
                Else
                    source.Background = Brushes.AliceBlue
                End If
            End If
        End Sub
private void OnButtonKeyDown(object sender, KeyEventArgs e)
{
    Button source = e.Source as Button;
    if (source != null)
    {
        if (e.Key == Key.Left)
        {
            source.Background = Brushes.LemonChiffon;
        }
        else
        {
            source.Background = Brushes.AliceBlue;
        }
    }
}

مثال لأحداث إدخال الماوس

في المثال التالي Background لون Button يتغير عندما يدخل المؤشر Button. Background يتم استعادة الألوان عند خروج الماوس Button.

المقطع الأول للمثال ينشئ StackPanel و يقوم Button بالتحكم بمعالجات الأحداث و توصيلها إلى MouseEnter و توصيل الأحداث MouseLeave إلى Button.

<StackPanel>
  <Button Background="AliceBlue"
          MouseEnter="OnMouseExampleMouseEnter"
          MouseLeave="OnMosueExampleMouseLeave">Button

  </Button>
</StackPanel>
            ' Create the UI elements.
            Dim mouseMoveStackPanel As New StackPanel()
            Dim mouseMoveButton As New Button()

            ' Set properties on Button.
            mouseMoveButton.Background = Brushes.AliceBlue
            mouseMoveButton.Content = "Button"

            ' Attach Buttons to StackPanel.
            mouseMoveStackPanel.Children.Add(mouseMoveButton)

            ' Attach event handler.
            AddHandler mouseMoveButton.MouseEnter, AddressOf OnMouseExampleMouseEnter
            AddHandler mouseMoveButton.MouseLeave, AddressOf OnMosueExampleMouseLeave
// Create the UI elements.
StackPanel mouseMoveStackPanel = new StackPanel();
Button mouseMoveButton = new Button();

// Set properties on Button.
mouseMoveButton.Background = Brushes.AliceBlue;
mouseMoveButton.Content = "Button";

// Attach Buttons to StackPanel.
mouseMoveStackPanel.Children.Add(mouseMoveButton);

// Attach event handler.
mouseMoveButton.MouseEnter += new MouseEventHandler(OnMouseExampleMouseEnter);
mouseMoveButton.MouseLeave += new MouseEventHandler(OnMosueExampleMouseLeave);

الجزء الثاني من المثال مكتوب بالتعليمات البرمجية وتقوم بتعريف معالج الأحداث. عندما يدخل الماوس في Button ، Background لون Button يتغير إلى SlateGray. عندما يترك الماوس في Button ، Background لون Button يرجع إلى AliceBlue.

        Private Sub OnMouseExampleMouseEnter(ByVal sender As Object, ByVal e As MouseEventArgs)
            ' Cast the source of the event to a Button.
            Dim source As Button = TryCast(e.Source, Button)

            ' If source is a Button.
            If source IsNot Nothing Then
                source.Background = Brushes.SlateGray
            End If
        End Sub
private void OnMouseExampleMouseEnter(object sender, MouseEventArgs e)
{
    // Cast the source of the event to a Button.
    Button source = e.Source as Button;

    // If source is a Button.
    if (source != null)
    {
        source.Background = Brushes.SlateGray;
    }
}
        Private Sub OnMosueExampleMouseLeave(ByVal sender As Object, ByVal e As MouseEventArgs)
            ' Cast the source of the event to a Button.
            Dim source As Button = TryCast(e.Source, Button)

            ' If source is a Button.
            If source IsNot Nothing Then
                source.Background = Brushes.AliceBlue
            End If
        End Sub
private void OnMosueExampleMouseLeave(object sender, MouseEventArgs e)
{
    // Cast the source of the event to a Button.
    Button source = e.Source as Button;

    // If source is a Button.
    if (source != null)
    {
        source.Background = Brushes.AliceBlue;
    }
}

إدخال النصوص

حدثTextInput يمكنك الانصات لإدخال نص بطريقة مستقلة عن الأجهزة. لوحة المفاتيح هي الوسيلة الأساسية لإدخال النص ولكن الكلام ، الكتابة اليدوية, كما يمكن أجهزة إدخال أخرى إنشاء نص الإدخال أيضاً.

لإدخال لوحة المفاتيح، WPF أولاً إرسال KeyDown / KeyUp الأحداث المناسبة. إذا لم تتم معالجة هذه الأحداث و المفتاح نصي (بدلاً من مفتاح تحكم مثل أسهم اتجاهات أو مفاتيح الوظائف) ثم TextInput تنفيذ الحدث. لا يوجد دوماً تعيين واحد-إلى-واحد بسيط بين KeyDown / KeyUp و TextInput الأحداث لأن ضغطات المفاتيح المتعددة يمكنها إنشاء حرف واحد من إدخال النص كما يمكن ضغط مفتاح واحد إنشاء سلاسل متعددة الأحرف. يكون هذا صحيحاً خاصة اللغات مثل الصينية واليابانية والكورية الذي استخدامه محررو أساليب الإدخال (IMEs) صواب إنشاء الآلاف من الأحرف المحتملة في الخاصة بهم المطابق الأبجدية.

عند WPF يرسل KeyUp / KeyDown الحدث، Key تعيين إلى Key.System إذا أصبحت ضغطات المفاتيح جزءًا من TextInput الحدث (إذا كان ALT + S الضغط, على سبيل المثال). يسمح هذا التعليمات البرمجية في KeyDown معالج الأحداث التحقق من وجود Key.System وفي حالة العثور عليه ، اترك المعالجة للمعالج فيما بعد لتنفيذ الحدث TextInput . في هذه الحالات، الخصائص المختلفة TextCompositionEventArgs تستخدم الوسيطة لتحديد ضغطات المفاتيح الأصلية. وبشكل مماثل، إذا IME نشط, Key قيمة Key.ImeProcessed ، و ImeProcessedKey يعطي ضغط المفاتيح الأصلي أو ضغطات المفاتيح.

يحدد المثال التالي hوler ل Clickحدث و hوler KeyDownحدث.

المقطع الأول للتعليمات البرمجية أو العلامات ينشء واجهة المستخدم.

<StackPanel KeyDown="OnTextInputKeyDown">
  <Button Click="OnTextInputButtonClick"
          Content="Open" />
  <TextBox> . . . </TextBox>
</StackPanel>
            ' Create the UI elements.
            Dim textInputStackPanel As New StackPanel()
            Dim textInputeButton As New Button()
            Dim textInputTextBox As New TextBox()
            textInputeButton.Content = "Open"

            ' Attach elements to StackPanel.
            textInputStackPanel.Children.Add(textInputeButton)
            textInputStackPanel.Children.Add(textInputTextBox)

            ' Attach event handlers.
            AddHandler textInputStackPanel.KeyDown, AddressOf OnTextInputKeyDown
            AddHandler textInputeButton.Click, AddressOf OnTextInputButtonClick
// Create the UI elements.
StackPanel textInputStackPanel = new StackPanel();
Button textInputeButton = new Button();
TextBox textInputTextBox = new TextBox();
textInputeButton.Content = "Open";

// Attach elements to StackPanel.
textInputStackPanel.Children.Add(textInputeButton);
textInputStackPanel.Children.Add(textInputTextBox);

// Attach event handlers.
textInputStackPanel.KeyDown += new KeyEventHandler(OnTextInputKeyDown);
textInputeButton.Click += new RoutedEventHandler(OnTextInputButtonClick);

يحتوي المقطع الثاني من تعليمات برمجية على معالجات الأحداث.

        Private Sub OnTextInputKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
            If e.Key = Key.O AndAlso Keyboard.Modifiers = ModifierKeys.Control Then
                handle()
                e.Handled = True
            End If
        End Sub

        Private Sub OnTextInputButtonClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
            handle()
            e.Handled = True
        End Sub

        Public Sub handle()
            MessageBox.Show("Pretend this opens a file")
        End Sub
private void OnTextInputKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.O && Keyboard.Modifiers == ModifierKeys.Control)
    {
        handle();
        e.Handled = true;
    }
}

private void OnTextInputButtonClick(object sender, RoutedEventArgs e)
{
    handle();
    e.Handled = true;
} 

public void handle()
{
    MessageBox.Show("Pretend this opens a file");
}

لأن أحداث الإدخال تسير بشكل فقاعي لأعلى طريق الأحداث StackPanel يتلقى الإدخال بغض النظر عن العنصر الذي عليه تركيز لوحة المفاتيح. TextBox إعلام عنصر التحكم أولاً و OnTextInputKeyDown يتم استدعاء المعالج فقط إذا كان TextBox لم يعالج الإدخال. إذا كان PreviewKeyDown حدث يُستخدم بدلاً من KeyDown حدث، OnTextInputKeyDown يتم استدعاء المعالج أولاً.

في هذا المثال، تتم كتابة منطق المعالجة مرتين-مرة واحد ل CTRL + O ثم مرة أخرى لحدث النقر فوق زر. يمكن تبسيط هذا باستخدام الأوامر ، بدلاً من معالجة أحداث الإدخال مباشرة. تمت مناقشة الأوامر في هذه النظرة العامة وفي نظرة عامة على الأوامر.

اللمس و المعالجة البارعة

واجهة برمجة تطبيقات في النظام التشغيل ‏‫النظام التشغيل Windows 7 وأجهزة جديدة توفر تطبيقات القدرة على إلى تتلقى الإدخال من إلى uches متعددة في نفس الوقت. WPFتمكين التطبيقات للكشف عن وتستجيب للمس بطريقة مشابهة للاستجابة إلى غير ذلك بإدخال، مثل كـ ماوس أو لوحة المفاتيح بواسطة رفع أحداث عند حدوث اللمس.

WPF يكشف اثنين من الأحداث عند حدوث اللمس: أحداث اللمس وأحداث المعالجة. توفر أحداث اللمس بيانات أولية حول كل إصبع على شاشة اللمس و حركته. تترجم أحداث المعالجة الإدخال على أنه إجراءات معينة. وستتم مناقشة نوعي الأحداث في هذا المقطع.

المتطلبات الأساسية

تحتاج إلى المكونات التالية لتطوير أحد تطبيقات التي تستجيب للمس.

  • Microsoft Visual Studio 2010.

  • Windows 7

  • جهاز، مثل كـ شاشة باللمس، يعتمد Windows اللمس.

المصطلحات

يتم استخدام المصطلحات التالية عند مناقشة اللمس.

  • لمس هو نوع من إدخال مستخدم التي يتم التعرف عليها من قبل ‏‫نظام التشغيل Windows 7. عادة، لمس هو بدأه وضع الاسترخاء تشغيل شاشة اللمس الحساسة. لاحظ أن الأجهزة مثل لوحة اللمس الشائعة على أجهزة الكمبيوتر المحمولة لا تدعم اللمس إذا كان الجهاز فقط يقوم بتحويل الموضع الخاص للإصبع وحركاته كـإدخال ماوس.

  • لمس متعدد هو اللمس الذي يحدث إلى أكثر من نقطة في نفس الوقت. Windows 7 و WPF يدعما اللمس المتعدد. كلما تتم مناقشة اللمس في وثائق WPF ، المفاهيم تنطبق علي اللمس المتعدد..

  • تحدث على M anipulation عند لمس هو تفسير كإجراء فعلية التي هو تطبيقها على كائن. في WPF ، تترجم أحداث المعالجة الإدخال على أنه معالجة ترجمة أو توسيع أو دوران.

  • touch deviceيمثل أحد الأجهزة التي تنتج اللمس إدخال، مثل إصبع مفرد تشغيل شاشة باللمس.

عناصر التحكم التي تستجيب إلى اللمس

يمكنك التمرير خلال عناصر التحكم التالية بواسطة سحب finger عبر عنصر التحكم إذا كان يحتوي على المحتوى الذي هو تمريره خارج عرض.

ScrollViewerتعرف ScrollViewer.PanningModeمرفقة خاصية التي تمكنك من تعيين ما إذا تم ممكّن تحريك اللمس أفقياً، رأسياً أو كليهما أو لا هذا ولا ذاك. ScrollViewer.PanningDecelerationتحدد خاصية يؤدي إلى سرعة التمرير إبطاء أسفل عندما يقوم مستخدم برفع إصبع من شاشة باللمس. ScrollViewer.PanningRatioتحدد خاصية المرفق نسبة التمرير إزاحة إلى ترجمة معالجة الإزاحة.

أحداث اللمس

الفئات الأساسية، UIElement ، UIElement3D ، و ContentElement و تعريف الأحداث التي يمكنك الاشتراك بها حتى يستجيب التطبيق الخاص بك إلى اللمس. أحداث اللمس مفيدة عندما يفسر التطبيق الخاص بك اللمس على أنه شيء أخر غير معالجة كائن. على سبيل المثال، التطبيق الذي يمكّن المستخدم الرسم بإصبع واحد أو أكثر يشترك في أحداث اللمس.

تعرف الثلاثة فئات الأحداث التالية التي تتصرف بالمثل، بغض النظر عن فئة التعريف.

مثل أحداث لوحة المفاتيح والماوس, أحداث اللمس هي الأحداث الموجهة. الأحداث التي تبدأ ب Preview هي أحداث النفق والأحداث التي تبدأ ب Touch هي أحداث الاتصال الفقاعي. للحصول على المزيد من المعلومات عن الأحداث الموجهة، راجع نظرة عامة حول الأحداث الموجهة. عند معالجة هذه الأحداث, يمكنك الحصول على موضع الإدخال بالنسبة إلى أي عنصر بواسطة استدعاء GetTouchPoint أو GetIntermediateTouchPoints الأسلوب.

لفهم التفاعل بين أحداث اللمس, اطلع على السيناريو حيث يضع المستخدم إصبع واحد على عنصر, يحرك الإصبع في العنصر و ثم يرفع الإصبع من العنصر. يبين المثال التالي تنفيذ bubbling أحداث (الوضع في نفق أحداث يتم حذف للبساطة).

لمس أحداث

تسلسل أحداث اللمس.

يلي قائمة يوضح تتابع الأحداث في التوضيح السابق.

  1. حدث TouchEnter يحدث مرة واحدة عندما يضع المستخدم إصبعه على العنصر.

  2. حدث TouchDown يحدث مرة واحدة.

  3. حدثTouchMove يحدث عدة مرات عندما يحرك المستخدم إصبعه داخل العنصر.

  4. الحدث TouchUp يحدث مرة واحدة عندما يرفع المستخدم إصبعه عن العنصر.

  5. حدث TouchLeave يحدث مرة واحدة.

عند استخدام اصبعين, الأحداث تحدث عن كل اصبع.

معالجة أحداث

بالنسبة للحالات الموقع يمكن تطبيق لمستخدم إلى معالجة كائن، UIElementبتعريف الفئة معالجة الأحداث. بعكس أحداث اللمس التي تبلغ ببساطة موضع اللمس, أحداث المعالجة تقرر كيفية تفسير الإدخال. هناك ثلاثة أنواع من manipulations والترجمة والتوسيع، و دوران. توضح القائمة التالية كيفية إلى استدعاء ثلاثة أنواع من manipulations.

  • وضع إصبع تشغيل كائن و تحريك finger عبر شاشة باللمس لاستدعاء معالجة ترجمة. هذا ينقل عادةً الكائن.

  • وضع إصبعين على كائن وتحريك الإصبعين أقرب معاً أو أبعد عن بعضهما البعض لاستدعاء معالجة التوسيع. هذا عادةً يغير حجم الكائن.

  • وضع إصبعين على كائن واستدارة الإصبعين حول بعضهما لاستدعاء معالجة الاستدارة. هذا عادةً يدير الكائن.

يمكن أن يحدث أكثر من نوع من المعالجة في نفس الوقت.

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

لمزيد من المعلومات حول كيفية إنشاء تطبيق يمكّن المستخدم نقل أو تغيير حجم أو ادارة كائن, راجع الإرشادات التفصيلية: إنشاء تطبيق اللمس الأول.

UIElementيحدد معالجة التالي أحداث.

بشكل افتراضي، UIElement لا يتلقى هذه الأحداث المعالجة. لتلقي أحداث المعالجة على UIElement قم بتعيين UIElement.IsManipulationEnabled إلى true.

مسار التنفيذ لأحداث المعالجة

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

يبين المثال التالي مسار تنفيذ معالجة الأحداث و معلومات هامة حول كل حدث.

أحداث المعالجة

تسلسل أحداث المعالجة.

يلي قائمة يوضح تتابع الأحداث في التوضيح السابق.

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

  2. حدثManipulationStarted يحدث تالي. هذا الحدث يقرر أصل المعالجة.

  3. حدث ManipulationDelta يحدث عدة مرات عندما تتحرك أصابع المستخدم على الشاشة باللمس. DeltaManipulation خاصية فئة ManipulationDeltaEventArgs تقرر ما إذا كان يتم تفسير المعالجة على أنها حركة أو توسيع ، أو ترجمة. هذا المكان الذي ينفذ فيه معظم التعامل مع كائن.

  4. حدثManipulationInertiaStarting يحدث عندما تفقد أصابع المستخدم جهة الاتصال مع الكائن. هذا الحدث يحدد تباطؤ المعالجات أثناء القصور. هذا يمكن الكائن الخاص بك مضاهاة مسافات فعلية مختلفة أو سمات, إذا اخترت. على سبيل المثال، افترض أن تطبيق الخاص بك يحتوي على الثاني من الكائنات التي تمثل عناصر في الواقع الفعلي، والآخر هو اسمك حيث يسهل من الآخر. يمكنك جعل الكائن الأثقل يتباطأ أسرع من الكائن الأخف.

  5. حدث ManipulationDelta يحدث عدة مرات عند حدوث القصور. لاحظ أن يحدث هذا حدث عند تحريك أصابعك للمستخدم عبر شاشة باللمس و عند WPFيحاكي inertia. بمعنى آخر، ManipulationDeltaقبل و بعد ManipulationInertiaStartingحدث.  ManipulationDeltaEventArgs.IsInertialتقارير الخصائص سواء ManipulationDeltaحدث أثناء inertia، حيث يمكنك فحص من هذه خاصية و تنفيذ الاجراءات مختلفة بالاعتماد تشغيل القيمة الخاصة به.

  6. ManipulationCompletedحدث عند معالجة و أية اﻷطراف inertia. التي هو، بعد الجميع ManipulationDeltaيتم إجراء الأحداث، ManipulationCompletedإجراء حدث الإشارة التي المعالجة هو كاملة.

UIElementكما يعرف ManipulationBoundaryFeedbackحدث. Th هو حدث عند ReportBoundaryFeedbackأسلوب هو سابقا في ManipulationDeltaحدث. ManipulationBoundaryFeedbackحدث على تمكين تطبيقات أو مكونات توفير ملاحظات مرئية عند كائن إلى حد. على سبيل المثال، Windowالمقابض لفئة ManipulationBoundaryFeedbackحدث تسبب الإطار إلى حد ما تحريك عند مواجهة حوافه.

يمكنك إلغاء الأمر في المعالجة بواسطة استدعاء Cancelأسلوب تشغيل وسائط الحدث في أي حدث معالجة استثناء ManipulationBoundaryFeedbackالحدث. عندما تقوم باستدعاء Cancel، لن يتم مرفوع الأحداث معالجة و تقع أحداث ماوس لللمس. يصف الجدول التالي العلاقة بين الوقت المعالجة هو إلغاء وأحداث الماوس التي تحدث.

حدث الذي قام بإلغاء هو سابقا في

أحداث ماوس التي تحدث للإدخال الذي حدث بالفعل

ManipulationStarting و ManipulationStarted

ماوس أسفل الأحداث.

ManipulationDelta

ماوس أسفل ونقل أحداث ماوس.

ManipulationInertiaStarting و ManipulationCompleted

ماوس لأسفل أو تحريك ماوس، و ماوس للأحداث.

لاحظ أنه في حالة الاتصال Cancelعند معالجة هو في inertia، يقوم الأسلوب بإرجاع falseولا إدخال غير raهوe ماوس الأحداث.

العلاقة بين اللمس و معالجة الأحداث

UIElementدائماً يتلقى باللمس أحداث. عند IsManipulationEnabledخاصية هو تعيين إلى true، UIElementيتلقى باللمس ومعالجة الأحداث. إذا TouchDownحدث غير hوled (هو Handledخاصية false)، يلتقط المنطق معالجة اللمس على العنصر و إنشاء معالجة الأحداث. إذا Handledخاصية هو تعيين إلى trueفي TouchDownلا يتم إنشاء حدث، ومعالجة المعلومات المنطقية معالجة الأحداث. يظهر التوضيح التالي العلاقة بين أحداث اللمس و معالجة الأحداث.

لمس و معالجة الأحداث

العلاقة بين أحداث اللمس والمعالجة

وتصف القائمة التالية العلاقة بين مبادرة و معالجة الأحداث التي يتم إظهارها في التوضيح السابق.

التركيز

في WPF يوجد مفهومين رئيسين متعلقين بالتركيز: تركيز لوحة المفاتيح و تركيز المنطقية.

التركيز على لوحة المفاتيح

يشير تركيز لوحة المفاتيح إلى العنصر الذي يتلقى حالياً إدخال من لوحة المفاتيح. يمكن أن يكون هناك عنصر واحد فقط على desktop لديه تركيز لوحة المفاتيح. في WPF ، يتم تعيين IsKeyboardFocused للعنصر الذي لديه تركيز لوحة المفاتيح إلى true. Keyboard الأسلوب الثابت FocusedElement يقوم بإرجاع العنصر الذي له حالياً تركيز لوحة المفاتيح.

يمكن الحصول على تركيز لوحة المفاتيح عن طريق النقر فوق عنصر أو عن طريق النقر فوق الماوس على بعض العناصر مثل TextBox. يمكن الحصول على تركيز لوحة المفاتيح أيضاً برمجياً باستخدام أسلوب Focus على فئة Keyboard. Focusمحاولات إلى إعطاء تركيز لوحة المفاتيح العنصر المحدد. العنصر المرجع ب Focus هو العنصر الذي له حالياً تركيز لوحة المفاتيح.

من أجل لعنصر الحصول على تركيز لوحة المفاتيح Focusable خاصية و IsVisible يجب تعيين الخصائص صحيحاً . بعض الفئات، مثل Panel لديها Focusable تعيينها false بشكل افتراضي; لذلك، قد تضطر لتعيين هذه الخاصية إلى true إذا كنت تريد تمكين هذا العنصر من الحصول على التركيز.

يستخدم المثال التالي Focus لتعيين تركيز لوحة المفاتيح على Button. المكان المستحسن لتعيين التركيز الأولي في التطبيق هو في معالج الحدث Loaded.

        Private Sub OnLoaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Sets keyboard focus on the first Button in the sample.
            Keyboard.Focus(firstButton)
        End Sub
private void OnLoaded(object sender, RoutedEventArgs e)
{
    // Sets keyboard focus on the first Button in the sample.
    Keyboard.Focus(firstButton);
}

للحصول على المزيد من المعلومات حول تركيز لوحة المفاتيح، راجع نظرة عامة حول التركيز.

تركيز منطقي

التركيز المنطقي يشير إلى FocusManager.FocusedElement في نطاق التركيز. يمكن أن يكون هناك عدة عناصر لديها تركيز منطقي في التطبيق ولكن يوجد فقط عنصر واحد لديه تركيز منطقي في نطاق تركيز معين.

نطاف التركيز هو عبارة عن عنصر حاوية يحتفظ بمعلومات عن FocusedElement داخل نطاقه. عندما يترك التركيز نطاق التركيز، العنصر المركز سيفقد تركيز لوحة المفاتيح ولكن سيحتفظ بالتركيز المنطقي. عندما يعود التركيز إلى نطاق التركيز، سيحصل العنصر المركز علي تركيز لوحة المفاتيح. يسمح هذا لتركيز لوحة المفاتيح أن يتغير بين عدة نطاقات تركيز ولكن يؤكد أن العنصر المركز في نطاق التركيز لا يزال العنصر المركز عند رجوع التركيز.

يمكن تغيير عنصر إلى نطاق تركيز في Extensible Application Markup Language (XAML) بواسطة إعداد FocusManager الخاصية المرفقة IsFocusScope إلى true ، أو في التعليمات البرمجية بواسطة تعيين الخاصية المرفقة باستخدام SetIsFocusScope الأسلوب.

يجعل المثال التالي StackPanel نطاق تركيز بواسطة تعيين الخاصية المرفقة IsFocusScope.

<StackPanel Name="focusScope1" 
            FocusManager.IsFocusScope="True"
            Height="200" Width="200">
  <Button Name="button1" Height="50" Width="50"/>
  <Button Name="button2" Height="50" Width="50"/>
</StackPanel>
            Dim focuseScope2 As New StackPanel()
            FocusManager.SetIsFocusScope(focuseScope2, True)
StackPanel focuseScope2 = new StackPanel();
FocusManager.SetIsFocusScope(focuseScope2, true);

الفئات في WPF التي هي نطاقات تركيز بشكل افتراضي Window ، Menu ، ToolBar ، و ContextMenu.

العنصر الذي يحتوي على تركيز لوحة المفاتيح لديه أيضاً التركيز المنطقي لـنطاق التركيز الذي ينتمي إليه; لذلك، تعيين التركيز على عنصر مع Focus الأسلوب على Keyboard سيحاول الفئة أو فئات العنصر الأساسي إعطاء العنصر تركيز لوحة المفاتيح و التركيز المنطقي.

لتحديد العنصر الذي تم التركيز عليها في نطاق التركيز ، استخدم GetFocusedElement. لتغيير عنصر تم التركيز عليه لنطاق تركيز, استخدم SetFocusedElement.

للحصول على المزيد من المعلومات حول التركيز المنطقي، راجع نظرة عامة حول التركيز.

موضع الماوس

WPF الإدخال API يوفر معلومات مفيدة بالنسبة إلى إحداثيات المسافات. على سبيل المثال، إحداثيات (0,0) الإحداثي العلوي الأيسر و لكن العلوي الأيسر لأي عنصر في الشجرة؟ صواب الهدف الإدخال وهو ؟ العنصر المرفق معالج الأحداث إليه ؟ أو شيء آخر ؟ ولتجنب التشويش WPF الإدخال API يتطلب تحديد إطار المرجع الخاص بك عند العمل بالإحداثيات المتلقى عبر الماوس. أسلوبGetPosition يقوم بإرجاع إحداثيات مؤشر الماوس نسبة إلى العنصر المحدد.

التقاط الماوس

أجهزة الماوس بشكل خاص تحمل صفة مشروطة تعرف بالتقاط الماوس. يتم استخدام التقاط الماوس للحفاظ على الحالة الانتقالية للإدخال عندما يتم تشغيل عملية السحب و الإفلات بحيث العمليات الأخرى التي تتضمن الموضع الاسمي للشاشة لمؤشر الماوس لا تحدث بالضرورة. أثناء السحب ، لا يمكن للمستخدم النقر دون إحباط السحب و الإفلات ، الذي يجعل معظم إشارات mouseover غير مناسبة أثناء التقاط الماوس المحجوز بواسطة أصل السحب. يكشف نظام الإدخال واجهات API التي تتمكن من تحديد حالة التقاط الماوس, بالإضافة إلى واجهات API التي تتمكن من فرض التقاط الماوس إلى عنصر محدد أو إلغاء حالة التقاط الماوس. للحصول على المزيد من المعلومات على عمليات السحب والإفلات, راجع نظرة عامة حول السحب و الإفلات.

الأوامر

الأوامر تمكن معالجة الإدخال في مستوى دلالي أكثر من جهاز الإدخال. الأوامر هي توجيهات بسيطة مثل Cut ، Copy ، Paste, أو Open. الأوامر مفيدة لمركزة منطق الأمر. قد يتم الوصول إلى نفس الأمر من Menu ،على ToolBar, أو من خلال اختصار لوحة المفاتيح. الأوامر أيضاً توفر آلية لتعطيل عناصر التحكم عند عدم توفر الأمر.

RoutedCommand هوWPF تطبيقICommand. عند RoutedCommandهو التنفيذ، PreviewExecuted Executedحدث هي raهوed على الهدف الأمر، مثل أي نفق والفقاعية من خلال شجرة عنصر إدخال الأخرى. إذا كان الهدف الأمر هو لم يتم تعيينها، العنصر ذو تركيز لوحة المفاتيح سيكون الأمر الهدف. المنطق الذي ينفذ الأمر مرفق CommandBinding. عند حدث Executed يصل إلى CommandBinding لهذا الأمر المحدد ExecutedRoutedEventHandler CommandBinding يسمى. المعالج هذا ينفذ إجراء الأمر.

للحصول على المزيد من المعلومات على الأوامر، راجع نظرة عامة على الأوامر.

WPF يوفر مكتبة شائعة التي تتكون منApplicationCommands ،MediaCommands ،ComponentCommands ،NavigationCommands ، وEditingCommands ، أو يمكنك تعريف الخاصة بك.

يظهر المثال التالي كيفية إعداد MenuItem بحيث عند النقر عليه سيتم استدعاؤه Paste الأوامر على TextBox ، على افتراض TextBox يحتوي على تركيز لوحة المفاتيح.

<StackPanel>
  <Menu>
    <MenuItem Command="ApplicationCommands.Paste" />
  </Menu>
  <TextBox />
</StackPanel>
            ' Creating the UI objects
            Dim mainStackPanel As New StackPanel()
            Dim pasteTextBox As New TextBox()
            Dim stackPanelMenu As New Menu()
            Dim pasteMenuItem As New MenuItem()

            ' Adding objects to the panel and the menu
            stackPanelMenu.Items.Add(pasteMenuItem)
            mainStackPanel.Children.Add(stackPanelMenu)
            mainStackPanel.Children.Add(pasteTextBox)

            ' Setting the command to the Paste command
            pasteMenuItem.Command = ApplicationCommands.Paste
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();

// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);

// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;

للحصول على مزيد من المعلومات حول الأوامر في WPF راجع نظرة عامة على الأوامر.

نظام الإدخال و العناصر الأساسية

إدخال الأحداث مثل الأحداث المرفقة المعرّفة من قِبل Mouse ، Keyboard ، و Stylus فئات تنفذ بواسطة نظام الإدخال و تدخل إلى موضع معين في طراز الكائن استناداً إلى التوصل لاختبار الشجرة المرئية في وقت التشغيل.

كل الأحداث التي Mouse ، Keyboard ، و Stylus تعرف, يتم أيضاً عرضها مجددا مرفقة الحدث بواسطة فئات العنصر الأساسي UIElement و ContentElement كجديد توجيه الأحداث . يتم إنشاء أحداث العنصر الأساسي الموجهة بواسطة الفئات التي تتعامل مع الحدث المرفق الأصلي إعادة استخدام بيانات الحدث.

عندما يصبح حدث الإدخال مقترن بعنصر مصدر معين من خلال تطبيق حدث إدخال العنصر الأساسي، يمكن توجيهه من خلال الجزء المتبقي من توجيه الأحداث استناداً إلى تركيب من كائنات الشجرة المنطقية و المرئية, و يمكن معالجته بواسطة ‏‫التعليمات البرمجية للتطبيق. بوجه عام، معالجة إدخال الأحداث المتعلقة بالجهاز باستخدام الأحداث الموجهة أكثر ملاءمة على UIElement ContentElement ، لأنك من الممكن أن تستخدم بناء جملة بديهي أكثر للحدث المعالج في كلا XAML و في التعليمات البرمجية. قد تختار معالجة الحدث المرفق الذي بدء العملية بدلاً من ذلك, ولكن سوف تواجه العديد من المشكلات: قد يتم تمييز الحدث المرفق كأنه معالج بواسطة فئة معالجة العنصر الأساسي, وتحتاج استخدام أساليب الاسترجاع بدلاً من بناء جملة الحدث صحيحاً من أجل إرفاق معالجات الأحداث المرفقة.

وماذا بعد

لديك الآن عدة تقنيات لمعالجة الإدخال في WPF. يجب أن يكون لديك فهم حسن لأنواع أحداث الإدخال وتقنيات الأحداث الموجهة المستخدمة من قبل WPF.

تتوفر الموارد الإضافية التي توضح WPF عناصر إطار العمل و توجيه الحدث بالتفصيل. راجع النظرات العامة التالية للحصول على المزيد من المعلومات ، نظرة عامة على الأوامر ، نظرة عامة حول التركيز ، نظرة عامة حول العناصر الأساسية ، الأشجار فى الWPF ، و نظرة عامة حول الأحداث الموجهة.

راجع أيضًا:

المبادئ

نظرة عامة حول التركيز

نظرة عامة على الأوامر

نظرة عامة حول الأحداث الموجهة

نظرة عامة حول العناصر الأساسية

موارد أخرى

Properties