2011-12-29 2 views
3

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

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

Есть ли лучший способ обойти это?

ответ

1

Да, это неизбежное следствие из макета пути рассчитывается. Избавление от горизонтальной полосы прокрутки потребует нескольких проходов через вычисление, но .NET делает только один проход. По уважительной причине макет может быть бистабильным, бесконечно перебрасывая между двумя состояниями.

Я действительно не понимаю, как TableLayoutPanel будет полезен здесь или что заставляет его расти. В общем, просто не прикрепите его, придайте ему размер, который вы хотите заполнить панелью. Что-то вроде этого возможно:

bool resizingTlp; 

    private void tableLayoutPanel1_Resize(object sender, EventArgs e) { 
     if (resizingTlp) return; 
     resizingTlp = true; 
     if (tableLayoutPanel1.Height <= panel1.ClientSize.Height) tableLayoutPanel1.Width panel1.ClientSize.Width; 
     else tableLayoutPanel1.Width = panel1.ClientSize.Width - SystemInformation.VerticalScrollBarWidth; 
     resizingTlp = false; 
    } 
2

Попробуйте это:

Outer panel:{AutoScroll=true, Dock=Fill} 
Inner panel:{Dock=Top,Width=customwidth} 
+0

Это сработало для меня. Хорошее решение без необходимости кодировать что-либо. – mancze