在ToolStrip上对相关控件进行分组,以便它们始终可见

时间:2015-10-12 22:21:33

标签: c# winforms toolstrip

我的应用程序有一个工具条,其中相关的控件由ToolStripSeparaters分开设置。它看起来像这样:

Scenario width adequate screen width. Related controls shown together.

但是,当窗口大小缩小时,某些控件会移动到一个小的下拉部分。不幸的是,这可以拆分相关的控件,例如在下面的屏幕截图中,"按标识过滤"标签,ID的关联文本框,以及"清除过滤器"按钮不再一起显示。

Narrower window with related controls split apart

如果必须将控件移动到下拉列表中,我希望将相关控件移动到一起。有没有办法在ToolStrip上将相关控件组合在一起?或者也许是处理这种情况的更好方法?

我尝试使用LayoutCompleted事件将所有控件移动到溢出区域,如果它们中的任何一个都在溢出中。

private void toolStrip1_LayoutCompleted(object sender, EventArgs e)
{
  var filterGroup = new List<ToolStripItem> { lblFilter, txtFilter, btnClearFilter };
  if (filterGroup.Any(x => x.IsOnOverflow))
  {
    filterGroup.ForEach(x => x.Overflow = ToolStripItemOverflow.Always);
  }
}

这似乎工作得很好,但是当窗口大小增加时,我还没有找到一个好方法再次显示它们。我使用以下代码尝试了ToolStrip的ResizeLayout事件:

var filterGroup = new List<ToolStripItem> { lblFilter, txtFilter, btnClearFilter };
filterGroup.ForEach(x => x.Overflow = ToolStripItemOverflow.AsNeeded);

1 个答案:

答案 0 :(得分:2)

您可以使用ToolStripControlHostwinforms TextBoxLabel进行分组。 E.g。

public class ToolStripLabelTextBox : ToolStripControlHost {

    public Label Label { get; private set; }
    public TextBox TextBox { get; private set; }

    public ToolStripLabelTextBox(String labelText) : base(new FlowLayoutPanel { FlowDirection = FlowDirection.LeftToRight, WrapContents = false, AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink, Padding = Padding.Empty, Margin = Padding.Empty }) {
        Label = new Label { Text = labelText, AutoSize = true, Anchor = AnchorStyles.Top | AnchorStyles.Bottom, TextAlign = System.Drawing.ContentAlignment.MiddleCenter };
        TextBox = new TextBox();

        FlowLayoutPanel panel = (FlowLayoutPanel) Control;
        panel.Controls.Add(Label);
        panel.Controls.Add(TextBox);
    }
}

另外两个选项是:

  1. 实施执行所需分组的LayoutEngine
  2. 实现显示标签和文本框的复合ToolStripItem。您可以使用ToolStripRadioButtonMenuItem作为示例:https://msdn.microsoft.com/en-us/library/vstudio/ms404318%28v=vs.100%29.aspx