Привязанные элементы управления WinForms не максимизируются правильно - PullRequest
8 голосов
/ 07 февраля 2011

У меня проблема с WinForms (VB.NET).

Главное окно - это контейнер MDI. Пользователь открывает новое дочернее окно:

non maximized child 1

, а затем максимизирует его, поэтому окно правильно заполняет клиентскую область. Мои элементы управления правильно привязаны (со свойством IDE Anchor) к сторонам окна, поэтому расширение окна всегда хорошо заполняет клиентскую область:

maximized child 1

В этом состоянии (клиентские окна развернуты) пользователь открывает другое или новое дочернее окно, но новые элементы управления окна не растягиваются, то есть они не «понимают», что должны растягиваться!

non stretched child 2

Это особенно раздражает, потому что если пользователь пытается восстановить окно, то элементы управления растягиваются, поэтому они исчезают (смотрите, что больше нет списка)!

restored child 2

Это ошибка? Как я могу решить это?

edit: согласно комментарию Ганса Пассанта, я создал новый простой проект, и он работал как надо. Поэтому я исследовал, чтобы увидеть, что отличалось от моего реального проекта и образца. Разница в том, что в моем проекте я создаю формы динамически.

Я динамически создаю много кнопок на панели инструментов. Когда пользователь нажимает кнопку, это исполняемый код:

Private Sub buttonClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Cursor.Current = Cursors.WaitCursor

        Dim b As Button = CType(sender, Button)

        Dim assem As Assembly = Assembly.GetExecutingAssembly()
        Dim formType As Type = assem.GetType(CStr(b.Tag))

        Dim exFormAsObj As Object = Nothing
        Try
            exFormAsObj = Activator.CreateInstance(formType)
        Catch ex As Exception
            Cursor.Current = Cursors.Default
            MessageBox.Show("clicca meglio:" + ex.ToString)
            Exit Sub
        End Try

        Dim f As Form = CType(exFormAsObj, Form)
        f.MdiParent = Me
        f.Show()

        Cursor.Current = Cursors.Default
    End Sub

То есть имя формы находится в теге кнопки. Я создаю новый экземпляр формы с Activator.CreateInstance(formType), затем показываю его: f.Show().

Я почти уверен, что проблема заключается в создании этой динамической дочерней формы, но я не могу понять, где.

edit2: Найденный! В моей форме обычное событие Load я делал

myform.SuspendLayout()
' various instructions
myform.ResumeLayout(False)

вместо False я должен был написать true: myform.ResumeLayout(True)

Так просто, прости.

Ответы [ 4 ]

3 голосов
/ 09 февраля 2011

Я нашел решение, (спасибо Коди Грэю за предложение опубликовать здесь мой собственный ответ).

В моей форме общее событие Load, которое я делал:

myform.SuspendLayout()
'' various instructions
myform.ResumeLayout(False)

вместо False Я должен был написать true: myform.ResumeLayout(True)

Просто, но сложно. Спасибо всем.

1 голос
/ 08 февраля 2011

Я думаю, что вы могли бы достичь, используя

this.LayoutMdi(MdiLayout.TileHorizontal);

или один из его родственников.

Имейте в виду, что макеты MDI, как правило, не рекомендуется.

0 голосов
/ 03 февраля 2017

Я использовал datagridview в дочерней форме mdi со всеми четырьмя сторонами на якоре, и он будет иметь правильный размер, пока форма не будет развернута. Если я создал форму, когда другие дочерние объекты были развернуты, она имела неправильный размер и никогда не исправляла себя, даже если вы нормализовали и изменили размер формы вручную. Мое решение состояло в том, чтобы поместить панель в форму со всеми четырьмя сторонами на якорь и поместить DGV в панель с установкой док-станции в файл. Я понятия не имею, почему я должен был сделать это, но это решило проблему.

0 голосов
/ 08 февраля 2011

Мои элементы управления правильно закреплены (со свойством IDE Anchor)

Возможно, попробуйте создать экземпляр формы и установить свойства программно в событии загрузки.

Если один экземпляр работает, а другие нет, это означает, что вам нужно проверить свойства экземпляров форм с помощью отладчика, чтобы убедиться, что они действительно установлены так, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...