2013-08-30 4 views
3

В основной форме приложения Windows Forms, которое я сейчас пишу, у меня есть SplitContainer с левой и правой панелью. Элементы управления на правой панели, у которых установлен якорь справа (или справа и слева), не остаются там, где я помещаю их в конструктора. Периодически элементы управления сдвигают пиксель влево (в дизайнере, а не во время выполнения). Для элементов управления, закрепленных как влево, так и вправо, управление будет уменьшаться, но для элементов управления, которые только что привязаны вправо, весь элемент управления перемещается влево при сохранении того же размера. Кто-нибудь знает, почему это происходит или как его избежать? Прямо сейчас, единственное, что я могу сделать, это периодически перемещать их обратно.Почему элементы управления в дизайнере WinForms изменяются отдельно?

Примечание: Мой конструктор Windows Forms в настоящее время устанавливается с LayoutMode = SnapToGrid, Привязка к сетке = True, и размер сетки 5 х 5.

Edit: я сумел найти способ воспроизвести эта проблема в Visual Studio 2012, наконец. Создайте новый проект Windows Forms с теми же настройками дизайнера, которые я использую, и добавьте SplitContainer в форму. Оставьте его пристыкованным для заполнения (или используйте анкеры со всех сторон). Теперь установите значение SplitterDistance равным 100, а SplitterWidth - 5. Добавьте кнопку вправо SplitPanel и установите привязку к нижнему и правому. Переместите кнопку так, чтобы ее правый край был близок к стороне SplitPanel, затем закройте и откройте форму. Волшебно, кнопка сдвинула один пиксель влево.

Вот как это выглядит, прежде чем закрыть его (в этом случае расположение кнопки составляет 105, 175): The form set up correctly

Вот что это выглядит как после закрытия и повторного открытия его (теперь местоположение данной кнопки составляет 104, 175): The form after being closed and reopened

Я надеюсь, что этот пример поможет любому воспроизвести проблему.

+2

Теперь я нашел способ воспроизвести проблему и соответствующим образом обновил вопрос. Надеюсь, это выводит меня из сферы «программистов, которые не будут документировать свою проблему». – ahouse101

ответ

6

Добавить кнопку вправо SplitPanel и установить ее привязку к нижнему и левому.

Нет, это должно быть Дно и Право получить репро для этого. Это вызвано назначением SplitterWidth. Установите его на 6, например, чтобы кнопка могла перемещаться на 2 пикселя.

Это вызвано неизбежным недостатком при расчете автоматической компоновки, то порядок имеет большое значение, и это плохо взаимодействует с интерфейсом ISupportInitialize, реализуемое SplitContainer. Сначала вычисляется макет панели, но он по-прежнему имеет размер, основанный на стандартном SplitterWidth. Следующий SplitContainer, теперь он замечает, что панель слишком широкая и сжимает ее. Который, потому что кнопка была уже привязана вправо, заставляет кнопку перемещаться на ту же величину, что панель была слишком широкой.

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

Многие возможные обходные пути для этого, в том числе не закрепленные справа, не изменяя ширину разделителя по умолчанию и не вычисляя положение кнопки самостоятельно.

+0

Ну, это неловко, я ошибся самым важным шагом (теперь он исправлен).Во всяком случае, это имеет прекрасный смысл, спасибо. Я думаю, что решение, которое я буду использовать, просто оставить ширину разделителя как значение по умолчанию (я могу изменить его позже в коде, если мне действительно нужно, я просто получил его как 5, потому что я решил, что было бы лучше, если бы это было то же самое как остальная часть моего приложения, где все элементы управления расположены на расстоянии 5 пикселей). – ahouse101

Смежные вопросы