2009-08-26 4 views
1

У меня есть макет средней сложности на основе нескольких вложенных TableLayoutPanel s. Изменение размера формы приводит к тому, что элементы управления внутри более глубоких вложенных таблиц визуально отстают от размера. Во-первых, это заставляет их выглядеть так, как будто они перемещаются, когда форма изменяется, но, что еще хуже, края элементов управления заметно обрезаются, когда они достаточно отстают, чтобы оставить выделенные ячейки таблицы.Как предотвратить контроль визуального отставания от изменения размера внутри TableLayoutPanel?

Есть ли способ предотвратить это или это лучший TableLayoutPanel?

Редактировать: Пройдя эксперимент с кучей программ, я пришел к выводу, что отставание от изменения размера является вездесущей проблемой. Мне кажется, что все ушли в отставку, что это неминуемо и приемлемо. Конечно, если это на самом деле неизбежно то принимая это, что гораздо проще :)

Самый простой способ увидеть отставание в вашей любимой программе «хороший UI»: изменить его, удерживая левую границу и смотреть все в порядке (или, альтернативно, верхняя граница & выровненных по нижнему краю элементов управления, таких как статусные). Все сломалось.

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

+0

В окне Skype chat не используются собственные элементы управления, однако любопытно, что он не задерживается - _unless_ Vista Aero включена, и в этом случае элементы управления сильно отстают. Не удалось найти другие приложения, на которые влияет Aero. –

ответ

0

Это вообще не представляется возможным, включая WPF (что на самом деле еще хуже - см. Вопрос this). Qt может избежать такого отставания, за исключением случаев, когда Aero включен. Sigh ...

1

Проблема с встроенными элементами управления в окнах заключается в том, что каждый элемент управления отвечает за рисование, растровое изображение на экран. Поскольку каждый элемент управления в элементе управления контейнером изменяется, область окна, который он занимает, становится недействительной, поэтому не только каждый элемент управления в контейнере перерисовывается, сам контейнер должен перерисовываться. Кроме того, события изменения размера/перерисовки происходят в потоке пользовательского интерфейса, поэтому это однопоточная операция. Основные механизмы, лежащие в основе собственного чертежа окна, не изменились с тех пор, как 16-битные окна представили его.

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

Чтобы посмотреть, как это должно быть, посмотрите на WPF. MS разработала его как средство решения этой проблемы.

Если WPF не является опцией, и вы используете формы Windows, проверьте документацию, связанную с , от Microsoft. Вы можете реализовать свой собственный механизм компоновки, а не полагаться на предложения Microsoft.

+1

Я пробовал эту же вещь в WPF, и, что удивительно, ОЧЕНЬ ТАМАЯ проблема существует :) Попробуйте - создайте выравниваемую по нижнему краю кнопку и измените размер формы в верхнем левом углу. –

0

DoubleBuffered = true. Вы можете установить его в формах.