Как сделать ToolStripComboBox, чтобы заполнить все пространство, доступное на ToolStrip? - PullRequest
5 голосов
/ 05 мая 2010

ToolStripComboBox помещается после ToolStripButton и сопровождается другим, который выровнен по правому краю. Как мне лучше всего настроить ToolStripComboBox, чтобы всегда корректировать его длину, чтобы заполнить все пространство, доступное между предыдущим и следующим ToolStripButtons?

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

Ответы [ 3 ]

5 голосов
/ 17 июня 2010

Я с большим успехом использую следующее:

private void toolStrip1_Layout(System.Object sender, System.Windows.Forms.LayoutEventArgs e)
{
    int width = toolStrip1.DisplayRectangle.Width;

    foreach (ToolStripItem tsi in toolStrip1.Items) {
        if (!(tsi == toolStripComboBox1)) {
            width -= tsi.Width;
            width -= tsi.Margin.Horizontal;
        }
    }

    toolStripComboBox1.Width = Math.Max(0, width - toolStripComboBox1.Margin.Horizontal);
}

Приведенный выше код не страдает от проблемы исчезновения управления.

2 голосов
/ 05 мая 2010

Для этого нет опции автоматической разметки. Но вы можете легко сделать это, реализовав событие ToolStrip.Resize. Это сработало хорошо:

    private void toolStrip1_Resize(object sender, EventArgs e) {
        toolStripComboBox1.Width = toolStripComboBox2.Bounds.Left - toolStripButton1.Bounds.Right - 4;
    }
    protected override void OnLoad(EventArgs e) {
        toolStrip1_Resize(this, e);
    }

Обязательно установите для свойства TSCB AutoResize значение False, иначе оно не будет работать.

1 голос
/ 13 августа 2015
ToolStrip ts = new ToolStrip();

ToolStripComboBox comboBox = new TooLStripComboBox();
comboBox.Dock = DockStyle.Fill;

ts.LayoutStyle = ToolStripLayoutStyle.Table;
((TableLayoutSettings)ts.LayoutSettings).ColumnCount = 1;
((TableLayoutSettings)ts.LayoutSettings).RowCount = 1;
((TableLayoutSettings)ts.LayoutSettings).SetColumnSpan(comboBox,1);

ts.Items.Add(comboBox);

Теперь поле со списком будет правильно заполнено. Установите столбец или диапазон строк соответственно.

...