إذا قمت بتغيير خصائص RightToLeft وShowInTaskbar، فسينتهي Form.ShowDialog() بشكل غير متوقع

StackOverflow https://stackoverflow.com/questions/152069

  •  02-07-2019
  •  | 
  •  

سؤال

يتم إغلاق الحوار بنتيجة الإلغاء، بدون استثناءات، كما لو قمت بالضغط على زر الإغلاق الخاص به.
المكان الآمن الوحيد لتعيين خاصية RightToLeft هو منشئ النموذج.

وخطر لي أن هذه المعلومة قد توفر وقت شخص آخر.
إذا أمكن تفصيل المسألة:إذا كان هناك تأكيد رسمي للخطأ، فما الذي قد يتسبب أيضًا في إنهاء ShowDialog بشكل غير متوقع، من فضلك، افعله.

يكرر:قريب من الدرج - منتديات MSDN

تغيير خاصية Form RightToLeft في وقت التشغيل


اقتباس من الرابط الثاني :

لقد وجدت الخلل الثاني في أقل من يومين.هذا الخطأ الجديد أمر بالغ الأهمية.

لدي نموذج عادي مع خاصية RightToLeft مضبوطة على قيمتها الافتراضية ( RightToLeft=False) .دعونا نعرض هذا النموذج باستخدام وظيفة Show ( Form1.Show(me))

يوجد في هذا النموذج زر يقوم بتغيير النموذج RightToLeft إلى Yes بدلاً من No:

الزر الفرعي الخاص 1_Click (مرسل ByVal كـ System.Object، ByVal e كـ System.EventArgs) يعالج Button1.Click
Me.RightToLeft = Windows.Forms.RightToLeft.Yes
نهاية الفرعية

سيقوم النموذج بتغيير عنوانه بنجاح إلى الجانب الأيمن.

حتى هذا لا توجد مشكلة.

تحدث المشكلة على النحو التالي

إذا قمنا بعرض هذا النموذج للمستخدم باستخدام وظيفة ShowDialog(Me) بدلاً من عرضه باستخدام Show(Me) .ثم انقر فوق الزر الذي سيؤدي إلى تغيير النموذج من اليمين إلى اليسار إلى نعم بدلاً من لا، وسيتم إغلاق النموذج فجأة دون أي أسباب، وحتى عدم طرح أي استثناءات.
هذه هي المشكلة الجديدة وهي موجودة أيضًا في .NET 3.0 (Orcase) أيضًا.

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

المحلول

نعم...لدي حل سريع بالنسبة لك.إنها مقرف, ، إنها hack لكنه نوعا ما يعمل.

من إجابتي إلى السؤال الأصلي:

private bool _rightToLeft;
private void SetRTL(bool setRTL)
{
    _rightToLeft = true;
    ApplyRTL(setRTL, this);
}

private void ApplyRTL(bool yes, Control startControl)
{
    if ((startControl is Panel) || (startControl is GroupBox))
    {
        foreach (Control control in startControl.Controls)
        {
            control.Location = CalculateRTL(control.Location, startControl.Size, control.Size);
        }
    }
    foreach (Control control in startControl.Controls)
        ApplyRTL(yes, control);
}

private Point CalculateRTL(Point currentPoint, Size parentSize, Size currentSize)
{
    return new Point(parentSize.Width - currentSize.Width - currentPoint.X, currentPoint.Y);
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    if (_rightToLeft)
    {
        _rightToLeft = false;
        e.Cancel = true;
    }
}

الجزء المخادع الذي يجب إرفاقه بـ حدث إغلاق النموذج ثم أخبره بعدم الإغلاق إذا كنت قد أجريت للتو مبادلة من اليمين إلى اليسار (_rightToLeft).بعد أن أخبرتها بعدم الإغلاق، قمت بإزالة العلم من اليمين إلى اليسار ودع الحياة تستمر.

*حشرة: هناك خطأ يحدث عند إغلاق نموذج مفتوح باستخدام .Show(this)، لكنني متأكد من أنه يمكنك إصلاح ذلك!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top