سؤال

لدي userControl (.NET 1.1 Winforms) الذي يحتوي على مربع صور قابل للنقر عليه كزر.

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

للقيام بذلك، أتعامل مع أحداث MouseEnter وMouseLeave الخاصة بـ UserControl، وإخفاء مربع الصورة وعرضه.هذا يعمل بشكل جيد.

ولكن عندما يكون مربع الصورة القابل للنقر مرئيًا، لم يعد بإمكاني النقر فوقه (يختفي مؤشر اليد ولا يتم تشغيل حدث النقر).

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

أنا لا أستخدم الحدث الصحيح؟

هل هناك طريقة أخرى لتحقيق ذلك؟

هنا هو الكود...

Private Sub NodoEstablo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.pictAdd.Visible = False 
End Sub


Private Sub NodoEstablo_MouseEnters(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter        
    Me.pictAdd.Visible = True
End Sub

معالج الحدث الإشكالي:

Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
    Me.pictAdd.Visible = False
End Sub

تحديث:إذا قمت بتغيير حجم مربع الصورة على MouseLeave (فقط لفعل شيء ما) فسيعمل.حتى الآن، يمنعني تغيير "المرئي" و"الموقع" في MouseLeave من النقر فوق مربع الصورة.:س

هل كانت مفيدة؟

المحلول

عندما يتحرك الماوس فوق الزر، يحدث شيء مشابه لما يلي:

  1. يترك الماوس عنصر تحكم المستخدم (على الرغم من أنه لا يزال داخل عنصر التحكم) ويدخل إلى مربع الصورة
    • لك MouseLeave يتم تشغيل معالج الأحداث، مما يجعل مربع الصورة غير مرئي
  2. نظرًا لأن مربع الصورة غير مرئي، يغادر الماوس مربع الصورة ويدخل إلى عنصر تحكم المستخدم
    • لك MouseEnter يتم تشغيل معالج الأحداث، مما يجعل مربع الصورة مرئيًا
  3. نظرًا لأن مربع الصورة أصبح مرئيًا الآن، تبدأ العملية من البداية

عندما قمت باختبار الكود الخاص بك، يومض "الزر" بشكل مستمر (لأنه استمر في تبديل رؤيته) ولم يتمكن من البقاء مرئيًا لفترة كافية لتسجيل أي نقرات.

إحدى طرق معالجة ذلك هي تعديل ملفك MouseLeaves المعالج ليكون شيء من هذا القبيل:

Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, _
                                    ByVal e As System.EventArgs) _
                                    Handles MyBase.MouseLeave
    If Not ClientRectangle.Contains(PointToClient(Cursor.Position)) Then
        Me.pictAdd.Visible = False
    EndIf
End Sub

يتحقق هذا للتأكد من أن الماوس قد ترك عنصر التحكم بالفعل قبل أن يختفي الزر.

قد يكون تغيير حجم صندوق الصور قد أدى إلى كسر الدورة الموضحة أعلاه، لكنه لا يعالج المشكلة الأساسية.

إليك بعض الأشياء الأخرى (التي ليس لها علاقة بسؤالك) التي يجب مراعاتها:

  • أعتقد أنه من المستحسن أن تقوم فقط بتجاوز OnMouseLeaves, ، وما إلى ذلك من الأساليب الموجودة في عنصر تحكم المستخدم الخاص بك، بدلاً من الاشتراك في الأحداث المقابلة.
  • تذكر أن التعامل مع عناصر التحكم بهذه الطريقة قد يجعل من المستحيل على أي شخص استخدام تطبيقك باستخدام لوحة المفاتيح فقط.(أي.لا يستطيع المستخدم فاتورة غير مدفوعة إلى الزر الخاص بك واضغط يدخل)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top