Почему стыковка Windows Forms не работает должным образом, когда вложенность глубока?
Привет. Надеюсь, кто-нибудь сможет мне помочь. Я уже несколько недель ломаю голову над этим вопросом и, кажется, ничего не могу сделать.
Проблема вот в чем. Когда вы вкладываете элементы управления в другие элементы управления и элементы управления пользователя-скажем, на шесть или семь уровней глубиной-внутренний элемент управления (который в данном конкретном случае является многострочным текстовым полем) не изменяется должным образом, когда родительские элементы управления изменяют размер.
О, он не просто не может изменить размер. Это было бы просто. Нет, его границы меняются, и в некоторых (но не во всех) случаях он перекрашивает себя должным образом, но текст продолжает обертываться на том же месте, даже несмотря на то, что размер элемента управления изменился.
Впервые я столкнулся с этой проблемой, когда писал пользовательский элемент управления панелью, и подумал, что это просто ошибка в моем коде. После того как я некоторое время бился головой о стену и ничего не добился, вчера я решил взять копию своего кода и удалить биты, пока проблема не исчезнет.
Я удалил весь код. Проблема оставалась.
Единственный оставшийся код-это графический код, который Visual Studio помещает за кулисы, когда вы добавляете элементы управления в поверхность дизайна, и небольшое количество дополнительного кода для окраски различных элементов управления, чтобы я мог видеть, что происходит.
Теперь я не могу очень хорошо вставить сюда код конструктора Windows Forms-он довольно многословен, как обычно бывает с таким кодом. Кроме того, есть полдюжины различных классов (все почти пустые). Итак, я загрузил исходный код и исполняемый файл отдельно в MegaUpload:
Источник: http://www.megaupload.com/?d=LDP09KRY[^]
Выполнимый: http://www.megaupload.com/?d=P7QKDMJJ[^]
Если вы не доверяете исполняемым файлам, просто загрузите исходный код. Он состоит из проекта и решения VS2010, а также полудюжины пользовательских элементов управления, которые не содержит кода.
Чтобы воспроизвести задачу, запустите программу и наблюдайте за тремя наборами концентрических квадратов. Каждый из них представляет собой панель, tablelayoutpanel или usercontrol. В центре каждого находится текстовое поле. Сделайте окно шире и обратите внимание, что текст в верхнем текстовом поле не переносится повторно, чтобы соответствовать новой ширине текстового поля.
Если размер самого текстового поля не изменяется, значит, он просто не перекрасился. Нажмите на одно из других текстовых полей, затем нажмите на оскорбительное текстовое поле, и оно перекрасится. Обратите внимание, что текст все равно будет обернут неправильно.
Интересно отметить, что если я просто вложу элементы управления вместо использования (бескодовых) пользовательских элементов управления; или если я использую однострочное текстовое поле или, скажем, кнопку, проблема исчезнет. Насколько я помню, проблема на самом деле не в этом ограниченный к многострочным текстовым полям, но в данном случае я смог воспроизвести его только с ними.
Я был бы очень признателен Вам за помощь, ребята. Ничто из того, что я пытаюсь сделать, не помогает. Я пробовал добавлять вызовы PerformLayout и тому подобное, но они ничего не делают. (К сожалению, исходный код Microsoft для кода макета содержит комментарии примерно следующего содержания:"этот бит не должен быть нужен, Но если я его выну, все сломается". Я думал, что Microsoft должна была понимать эта штука?)
Пожалуйста, не предлагайте глупые вещи вроде "не используйте стыковку" или "не вкладывайте свои элементы управления так глубоко" - они бесполезны. Причина в том, что стыковка-это официальный метод организации элементов управления в .NET; и даже если бы я чувствовал себя в состоянии уменьшить уровень вложенности (чего мне все равно не следовало бы делать), я не могу контролировать, насколько глубоко кто-то другой решит вложить мой элемент управления. Гнездование должно работать. Стыковка должна сработать.
Sergey Alexandrovich Kryukov
Вы правы. Вам действительно нужно использовать док и гнездо так глубоко, как вы хотите; и хорошее гнездование-хороший знак. Тем не менее, макет легко испортить. Проблема, вероятно, не в коде пользовательского интерфейса, а в ИТ-дизайнере-он иногда "помогает" все испортить...
--СА
ChewsHumans
Ну, я искал до тех пор, пока мои глаза не начали кровоточить, и ничего не нашел. Я полагаю, вы не могли бы взглянуть на проект и посмотреть, не придет ли вам что-нибудь в голову? Я был бы вам очень признателен.
Sergey Alexandrovich Kryukov
У меня нет VB.NET установлен, извините. Это первое, что я удаляю из параметров установки при установке Visual Studio.
Я вложил в свой ответ несколько советов, пожалуйста, смотрите.
Удачи, счастливого Нового года.
--СА