【问题标题】:How to make a ToolStripComboBox to fill all the space available on a ToolStrip?如何使 ToolStripComboBox 填充 ToolStrip 上的所有可用空间?
【发布时间】:2010-05-04 21:26:40
【问题描述】:

ToolStripComboBox 放置在 ToolStripButton 之后,后面是另一个右对齐的。如何最好地将 ToolStripComboBox 设置为始终调整其长度以填充前面和后面的 ToolStripButtons 之间的所有可用空间?

过去我曾经处理父级调整大小事件,根据相邻元素坐标计算要设置的新长度并设置新大小。但是现在,当我正在开发一个新的应用程序时,我想知道是否没有更好的方法。

【问题讨论】:

    标签: c# winforms toolstrip toolstripcombobox


    【解决方案1】:

    我使用以下方法取得了巨大成功:

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

    上面的代码没有出现控制消失的问题。

    【讨论】:

    • 使用 VS2010/.NET 4:如果我很快调整表单大小,我仍然会遇到控件消失的问题。但是通过在表单的 resize 事件处理程序中添加 toolStrip1.PerformLayout() 很容易解决。
    • 这在使用 96 dpi 以外的 dpi 设置时似乎无法正常工作。宽度设置过大后会缩放。
    【解决方案2】:

    没有自动布局选项。但是您可以通过实现 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,否则将不起作用。

    【讨论】:

    • 这里有一个问题(我不记得我以前有过这样的问题,当我使用 V2005 时)。在每个奇数显着性(如果尺寸差异小到几个像素左右,则不会发生效果)尺寸减小 ToolStripComboBox 消失(如果我再次减小它会出现(如果我再次减小它会再次消失) ) 或增加)。 AutoResize 设置为 false,增加要减去的数字(在您的示例中为 4)没有帮助。 ToolStrip 位于 SplitContainer 面板内,每次通过拖动 SplitContainer 拆分器调整 mannel 的大小时都会调整其大小。
    • 我描述的问题模式最常见的情况是从最大化状态恢复表单 - ToolStripComboBoxes(在左侧面板和右侧面板中)在这种情况下都会消失。
    • 为了防止ToolStripComboBoxUser Form 从最大化状态调整大小后消失,我使用了这个技巧:ToolStripComboBox.Visible = false; ToolStripComboBox.Visible = true;toolStrip1_Resize 事件处理程序中紧跟在toolStripComboBox1.Width = ... 之后。 HTH
    【解决方案3】:
    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);
    

    现在组合框将正确停靠填充。相应地设置列或行跨度。

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 2016-12-25
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 2011-10-16
      相关资源
      最近更新 更多