Вложенные контейнеры SplitContainer содержат ошибку SplitterWidth

Итак, у меня есть 3 сплит-контейнера, по 2 панели в каждом.

SplitContainer1 — это основной контейнер, закрепленный в форме ( Parent ).

SplitContainer1.Panel1 содержит SplitContainer2, который закреплен.

SplitContainer1.Panel2 содержит SpliContainer3, который закреплен.

Все идет нормально.

SplitContainer1 имеет SplitterWidth из 3. SplitContainer2 и SplitContainer3 имеет SplitterWidth из 6.

В Конструкторе вы можете увидеть SplitterWidth разницу между ними, но когда я создаю решение, SplitterWidth из SplitContainer2 и SplitContainer3 сбрасывается обратно на 4, независимо от того, что я делаю. Я изменил код в «InitializeComponent» формы безрезультатно.

Единственный способ, которым я получил эту работу, - это Load Event формы, повторно указать SplitterWidths, что я считаю совершенно глупым. Почему SplitterWidths не останется на том значении, которое я указал в Дизайнере?

Если кто-нибудь может пролить свет на это, что было бы здорово!!

Спасибо за ваше время,

Питер


person Peter    schedule 09.11.2014    source источник
comment
Я смог воспроизвести проблему на своем конце. Очевидно, так не должно работать. Похоже на ошибку в том, как свойство окружения из SplitContainer1 копируется в два других? Поскольку это ошибка, нет обходного пути, кроме глупого подхода, который вы уже поняли. Извини чувак.   -  person Idle_Mind    schedule 09.11.2014
comment
Да, это ошибка. Неудачное взаимодействие между реализацией ISupportInitialize, которую использует SplitContainer, что задерживает назначение фактических свойств. И расчет макета для панели, который заставляет назначать ширину сплиттера. Со своим старым значением, а не с ожидаемым новым значением. Обходной путь довольно прост, просто назначьте свойства в конструкторе формы после вызова InitializeComponent().   -  person Hans Passant    schedule 09.11.2014
comment
@HansPassant. Ганс, исходя из вашего опыта, как вы думаете, есть ли шанс исправить эти ошибки? Я отправил похожий и он был отклонен. Парни из .NET вообще боятся нарушить обратную совместимость с помощью этих исправлений? Должен ли я продолжать сообщать о них или я должен отказаться от этого?   -  person miroxlav    schedule 04.08.2015
comment
Этого не произойдет, эти ошибки должны были быть устранены в 2005 году. Не произошло, слишком занят WPF. Их больше не исправить, слишком много программ зависели от ошибочного поведения.   -  person Hans Passant    schedule 04.08.2015
comment
Это напоминает мне об ошибке, связанной с переименованием SplitContainters. Это огромный вопрос (поскольку он ломает решение), и ни один из них никогда не рассматривался...   -  person Oak_3260548    schedule 15.03.2016
comment
Единственный способ, которым я смог преодолеть эту ошибку (которая все еще существует сегодня), — это программно добавить SplitContainers (и все их элементы управления).   -  person xfx    schedule 01.07.2016


Ответы (1)


Лишь бы это не осталось без ответа навеки -

Это старая ошибка, которая присутствует во многих версиях Visual Basic и никогда не устранялась (и вряд ли когда-либо будет исправлена).

Как упоминает Ханс Пассант, проблема связана с реализацией ISupportInitialize для SplitContainer.

Поскольку это ошибка, нет окончательного способа решения проблемы, который имел бы какой-либо логический смысл.

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

Альтернативой является программная перезагрузка SplitterWidths, будь то Form_Load, что наиболее вероятно, или где-то еще в коде, где это может потребоваться.

person David    schedule 16.12.2016