Использование свойства привязки с динамически добавленными элементами управления - PullRequest
3 голосов
/ 03 мая 2009

Я добавляю некоторые текстовые поля в форму динамически во время выполнения. Все работает нормально, т.е. текстовые поля выровнены, закреплены и автоматически изменяют размеры до тех пор, пока форма не будет развернута. При максимизации формы текстовые поля добавляются в то же место, пока форма была не развернута , Это вызывает смещение текстовых полей.

Как я могу убедиться, что все текстовые поля находятся в одном и том же месте и имеют одинаковый размер, в то время как состояние окна нормальное, а также развернуто?

EDIT:

Кстати, я использую C #

EDIT:

Будет ли здесь полезна панель воспроизведения?

Ответы [ 2 ]

2 голосов
/ 04 мая 2010

Это довольно старый вопрос, но, возможно, я смогу на него ответить.

После прочтения всех ваших комментариев, я думаю, что могу обобщить вашу проблему к этому:

  • У вас есть форма определенного размера и вы добавляете некоторые элементы управления во время выполнения в определенном месте с привязкой, установленной на Top | Right.
  • Если вы просто отображаете форму и позволяете элементам управления появиться, все работает нормально
  • Если вы максимизируете свою форму (или измените ее размер), ваши элементы управления больше не будут отображаться в нужном месте.

Чтобы избавиться от этой проблемы, вы можете попробовать несколько разных подходов:

  1. Используйте FlowLayoutPanel , позаботьтесь о FlowDirection и, возможно, просто создайте все необходимые элементы управления заранее и просто переключите видимое состояние.
  2. Используйте правильные значения для местоположения вновь созданных элементов управления.

Второй момент - ваша ошибка (я думаю). Вы нашли способ вычислить местоположение вашего элемента управления, если ваша форма имеет оригинальный размер. Чтобы получить правильную позицию, если размер формы изменился (например, увеличен), вы должны учитывать несколько факторов.

  • Дельта-значения от вашего размера по умолчанию до вашего текущего размера.
  • Якорь (и), которые вы хотите установить на свой контроль.

В вашем случае вы хотели бы поставить элемент управления, который привязан Top | Right, но расположение установлено Top | Left. В этом случае вы должны вычислить разницу между control.location.x и form.width в его размере по умолчанию. Затем вы берете эту разницу и вычитаете ее из текущей ширины формы. Теперь вы можете поместить свой элемент управления в эту позицию (потому что Top никогда не изменяется при изменении размера). Если у вас есть Якорь на Bottom | Right, вы должны рассчитать то же самое с control.location.y и form.height.

Поведение и расчет, если якорь не установлен, для Top | Bottom или Left | Right оставлены в качестве упражнения для читателя. ; -)

Наконец, что не менее важно, есть еще один хакерский способ получить контроль над правильной позицией:

  • Если вы хотите разместить новый элемент управления где-нибудь, измените Form.Visible на false
  • Сохранение состояния формы, размера и местоположения
  • Измените их на значения по умолчанию
  • Добавьте нужные элементы управления
  • Восстановление ранее сохраненных значений
  • Сделайте форму снова видимой.
0 голосов
/ 04 мая 2009

Свойство Anchor определяет границы, которые должны обеспечивать элементы управления, чтобы они всегда находились на одинаковом расстоянии. Это может привести к путанице, поэтому вы видите, как все меняется, когда привязывается к правой границе.

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

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