2010-05-04 3 views
5

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

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

ответ

1

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

Обязательно установите свойство AUTORESIZE в TSCB к Ложные или он не будет работать.

+0

Здесь проблема (я не помню, что у меня было такое в прошлом, когда я использовал V2005). На каждом нечетном значении (эффект не имеет места, если разница в размере составляет всего пару пикселей или около того) Уменьшение размера ToolStripComboBox исчезает (появляется, если я уменьшу его еще раз (и снова исчезнет, ​​если я уменьшу его еще раз)) или увеличить его). AutoResize имеет значение false, увеличивая цифру, подлежащую вычитанию (которая равна 4 в вашем примере) не помогла. Инструмент ToolStrip находится внутри панели SplitContainer и изменяется каждый раз при изменении размера рулона путем перетаскивания разделителя SplitContainer. – Ivan

+0

Наиболее распространенный случай возникновения шаблона проблемы, который я описываю, заключается в восстановлении формы из максимизированного состояния - в этом случае исчезнут как ToolStripComboBoxes (на левой панели, так и на правой панели). – Ivan

+0

Чтобы предотвратить исчезновение «ToolStripComboBox» после изменения «Пользовательской формы» из максимизированного состояния, я использовал этот хак: «ToolStripComboBox.Visible = false; ToolStripComboBox.Visible = true; 'внутри обработчика событий toolStrip1_Resize' сразу после' toolStripComboBox1.Width = ... '. HTH – dee

5

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

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); 
} 

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

+2

Использование VS2010/.NET 4: Если я очень быстро изменяю размер формы, я все равно получаю проблему с исчезновением элементов управления. Но это легко решить, добавив toolStrip1.PerformLayout() в обработчик события изменения размера формы. – 2011-02-09 11:00:47

+0

Это не работает должным образом при использовании параметра dpi, отличного от 96 dpi. Ширина будет масштабирована после установки ее слишком большой. – kjbartel

1
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); 

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

 Смежные вопросы

  • Нет связанных вопросов^_^