Делать управление стыковкой и полосами прокрутки играть приятно - PullRequest
3 голосов
/ 30 декабря 2011

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

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

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

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

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

Outer panel:{AutoScroll=true, Dock=Fill}
Inner panel:{Dock=Top,Width=customwidth}
1 голос
/ 30 декабря 2011

Да, это неизбежное следствие способа расчета макета. Чтобы избавиться от горизонтальной полосы прокрутки, потребуется несколько проходов в расчете, но .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;
    }
...