WinForms: как избежать горизонтальной полосы прокрутки с помощью AutoScroll?

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

Как правильно гарантировать, что горизонтальная полоса прокрутки не появляется, когда в ней нет необходимости, учитывая, что я контролирую размещение элемента управления вручную (не полагаясь на AnchorStyles)? (Примечание: я не могу управлять свойством VScroll вручную, потому что я использую Compact Framework; и если минимальная ширина элемента шире, чем клиентская область, тогда горизонтальная полоса прокрутки потребуется на законных основаниях.)


person Qwertie    schedule 04.03.2011    source источник


Ответы (2)


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

Что я сделал, чтобы определить, отображается ли полоса прокрутки:

  1. Для элемента управления был установлен тест для WS_VSCROLL через P / Invoke через GetWindowLong ().
  2. Просканируйте дочерние элементы элемента управления для элемента управления с вертикальной полосой прокрутки.

Выбор правильного варианта зависит от того, как элемент управления обрабатывает полосы прокрутки.

Также это было в Windows, а не в CF, поэтому я не уверен, будет ли это работать точно так же.

person shf301    schedule 06.03.2011
comment
Оказывается, прокрутка на Compact Framework слишком медленная для того, что я хотел сделать (iPhone-подобный FlickList), поэтому мне больше не нужен ответ. Вместо этого мне пришлось бы самому рисовать элементы управления, чтобы добиться достаточной производительности. Интересно, однако, в какой момент появляется полоса прокрутки? Нам нужно будет обработать событие, которое происходит сразу после появления полосы прокрутки, чтобы правильно определить ее присутствие. Отдельная проблема: ожидание появления полосы прокрутки вызывает мерцание, потому что элемент управления будет перерисован дважды, но это (было бы) меня устраивало. - person Qwertie; 08.03.2011

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

System.Windows.Forms.SystemInformation.VerticalScrollBarWidth
person Saeb Amini    schedule 06.03.2011
comment
Ааа, но если полосы прокрутки еще нет, то особо не хочу это учитывать. Необходимость в вертикальной полосе прокрутки можно обнаружить только после вычисления макета дочерних элементов управления или после того, как событие Resize создаст его. - person Qwertie; 12.03.2011