c# - textbox1 - كيف يمكنني التقاط Keys.F1 بغض النظر عن السيطرة المركزة على نموذج؟




textbox1 keypress (3)

طريقة أخرى هي تجاوز الدالة ProcessCmdKey http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=VS.100).aspx

استخدمت حدث KeyDown وبعض الكود البسيط مثل if (e.KeyCode == Keys.F1) تم ضغط if (e.KeyCode == Keys.F1) لالتقاط F1 على نموذج BUT إذا كان هناك بعض مربعات النص في النموذج أو إذا كان هناك بعض جداول البيانات مع Dock Fill في النموذج ثم الرمز أعلاه يصبح عديم الفائدة ولا يفعل شيئا. ولكن أريد أن أفعل شيئًا عندما يضغط المستخدم على F1 في هذا النموذج. إذن كيف نلتقط حدثًا محددًا للرأس مثل F1 في النموذج بالكامل ... ولا أريد الانتقال إلى المسار الذي يلتقط KeyDown لجميع عناصر التحكم الأخرى في النموذج ونمررها إلى النموذج للمعالجة. هل هناك أي طريقة أنظف للقيام بذلك؟


قم بتشغيل KeyPreview وسيتم توجيه كل ضغطة مفتاح في النموذج من خلال معالجات الأحداث الرئيسية أولاً.


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

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.F1)
    {
        MessageBox.Show("You pressed the F1 key");
        return true;    // indicate that you handled this keystroke
    }

    // Call the base class
    return base.ProcessCmdKey(ref msg, keyData);
}

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

وأنت أفضل قبالة تجاهل خاصية KeyPreview . هذه مفارقة تاريخية من VB 6 أيام وليست الطريقة المفضلة فعلاً للقيام بذلك في عالم .NET. مزيد من القراءة: عيوب إعداد Form.KeyPreview = صحيح؟





keyevent