سؤال

لقد قمت بإنشاء نموذج اختبار بسيط باستخدام FormBorderStyle = FixedToolWindow افتراضيًا وأضفت زرًا للتبديل بين FixedToolWindow وSizableToolWindow عند الضغط على الماوس.

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

على سبيل المثال، إليك رمز الزر:

private void button1_Click(object sender, System.EventArgs e) {
    if(FormBorderStyle == FormBorderStyle.FixedToolWindow) {
        System.Diagnostics.Debug.WriteLine("SWITCHING: FIXED -> SIZABLE");
        FormBorderStyle = FormBorderStyle.SizableToolWindow;
    } else {
        System.Diagnostics.Debug.WriteLine("SWITCHING: SIZABLE -> FIXED");
        FormBorderStyle = FormBorderStyle.FixedToolWindow;
    }
}

ولتصحيح الأخطاء أستخدم هذا:

private void Settings_SizeChanged(object sender, System.EventArgs e) {
    System.Diagnostics.Debug.WriteLine(this.Size);
}

وهنا الإخراج عندما أضغط على زر التبديل:

SWITCHING: FIXED -> SIZABLE
{Width=373, Height=169}
{Width=383, Height=179}
SWITCHING: SIZABLE -> FIXED
{Width=383, Height=179}
{Width=373, Height=169}

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

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

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

يرجى النظر هنا:
http://screencast.com/t/0vT1vCoyx2u

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

المحلول

مشكلتك تتعلق بتغيير الموقع وليس الحجم.هذا الكود يحل المشكلة التي تظهر في الفيديو.

        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            Point _location = this.PointToScreen(this.ClientRectangle.Location);
            if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
            {
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            }
            else
            {
                this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
            }
            Point _newloc = this.PointToScreen(this.ClientRectangle.Location);
            Size _diff = new Size(_newloc) - new Size(_location);
            this.Location -= _diff;
        }

يبدو لي أن مشكلة تحرك النموذج المعروض عند التبديل بين هذين النمطين الحدوديين هو خطأ في DWM.

نصائح أخرى

أظن أن ما يحدث هو أن Windows Forms يحتفظ بحجم العميل (أي.المنطقة الداخلية) نفس الشيء بينما يتغير حجم الحدود.يعد هذا أمرًا جيدًا بشكل عام لأنه يضمن أن النافذة لا تزال قادرة على احتواء المحتوى الذي قمت بوضعه عليها بشكل صحيح.

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

هذا عمل جيد بالنسبة لي:

    private Size _size;
    private void Form1_DoubleClick(object sender, EventArgs e)
    {
        _size = this.Size;
        if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
        {
            this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        }
        else
        {
            this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
        }
        this.Size = _size;
    }

كان لي نفس المشكلة.يتغير حجم العميل عندما تقوم بتعيين FormBorderStyle ولكن لا يبدو أنه تم وضعه في خاصيةclientrectangle على الفور.لقد نجح الكود المذكور أعلاه تقريبًا بالنسبة لي، ولكن بدلاً من حجم المتجر فقط، تأكد من تخزين حجم العملاء.بالطبع، في المثال أعلاه ربما كانت كلمة "هذا" إشارة إلى حجم العملاء - لم أكن متأكدًا.شراء على أي حال، وهذا عملت بالنسبة لي:

_frmfilter.height = 300 dim _size as size = .clientsize _frmfilter.formborderstyle = formborderstyle.fixedToolwindow _frmfilter.clientsize = _size

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