TableLayoutPanel: Не удается правильно получить размер строк содержимого - PullRequest
5 голосов
/ 02 февраля 2010

Я использую TableLayoutPanel, чтобы разделить клиентскую область на 3 строки (есть только 1 столбец). Верхний и нижний ряды имеют фиксированную высоту; они будут содержать верхний и нижний колонтитулы, каждый из которых изначально содержит дочерний элемент управления меткой, содержащий статический текст (для начала). Средний ряд должен быть динамически изменен, чтобы заполнить оставшуюся область. Эта средняя панель в конечном итоге будет содержать список. У меня есть класс менеджера, который принимает в качестве аргумента объект панели (ExplorerTableLayoutPanel), управляемый:

public class ExplorerTableLayoutPanelManager
{       
    public ExplorerTableLayoutPanelManager(ExplorerTableLayoutPanel panel)
    {
        LayoutPanel = panel;
    }

Существует 3 метода, которые создают каждую из 3 строк в макете таблицы:

    private void AddHeaderRow()
    {
        const int headerHeight = 30;
        LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, headerHeight));

        Label label = new Label();
        label.BackColor = Color.AliceBlue;
        label.BorderStyle = BorderStyle.None;
        label.ForeColor = Color.LightGray;
        label.TextAlign = ContentAlignment.MiddleRight;
        label.Text = "Header Banner";
        label.Dock = DockStyle.Fill;
        float size = label.Font.SizeInPoints;
        label.Font = new Font(label.Font.Name, size * 2);

        const int column = 0, row = 0;
        LayoutPanel.Controls.Add(label, column, row);
    }


    private void AddBodyRow()
    {
        LayoutPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize));

        Label label = new Label();
        label.BorderStyle = BorderStyle.FixedSingle;
        label.ForeColor = Color.LightGray;
        label.TextAlign = ContentAlignment.MiddleCenter;
        label.Text = "Content Under construction ...";
        label.Dock = DockStyle.Fill;

        float size = label.Font.SizeInPoints;
        label.Font = new Font(label.Font.Name, size * 2);

        const int column = 0, row = 1;
        LayoutPanel.Controls.Add(label, column, row);
    }


    private void AddFooterRoow()
    {
        const int footerHeight = 30;
        LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, footerHeight));

        Label label = new Label();
        label.BackColor = Color.AliceBlue;
        label.BorderStyle = BorderStyle.None;
        label.ForeColor = Color.LightGray;
        label.TextAlign = ContentAlignment.MiddleRight;
        label.Text = "Footer Banner";
        label.Dock = DockStyle.Fill;

        float size = label.Font.SizeInPoints;
        label.Font = new Font(label.Font.Name, size * 2);

        const int column = 0, row = 2;
        LayoutPanel.Controls.Add(label, column, row);
    }

Проблема, которую я вижу, состоит в том, что последняя строка занимает фиксированную высоту строки, которую я запросил как 30. Эта часть верна. Однако первый и второй ряды делят оставшееся пространство поровну между ними, а это не то, что я хочу. Как видите, я явно установил высоту строки 30 для первой строки точно так же, как и для последней строки, но, похоже, это не сработает. Во 2-й строке (в середине) для размера RowStyle установлено значение SizeType.AutoSize, которое, как я предполагал, означало использование оставшегося пространства, поэтому не устанавливайте размер явно. Я могу ошибаться, но я не уверен.

Ответы [ 2 ]

11 голосов
/ 07 апреля 2010

Я не проверял ваш код, но с первого взгляда:

private void AddBodyRow()    
{
    LayoutPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
    ...

Поскольку вы хотите заполнить оставшееся пространство, не нужно SizeType.AutoSize, в противном случае строка тела будет пытаться сжаться до размера метки, даже если для метки установлено значение DockStyle.Fill. Вы хотите, чтобы строка заполнила все пространство, которое она может, используя SizeType.Percent:

private void AddBodyRow()    
{
    LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100f));
    ...
6 голосов
/ 15 июля 2011

Я долго боролся с правильным изменением размеров этого объекта, пока не обнаружил, что мне нужно сначала удалить существующие стили, добавленные инструментом конструктора:

.RowStyles.Clear();

Тогда новые стили работают:

.RowStyles.Add(new RowStyle(SizeType.AutoSize));
...