c# - 将 ToolStrip 上的相关控件分组,以便它们始终一起可见

标签 c# winforms toolstrip

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

Scenario width adequate screen width. Related controls shown together.

但是,当窗口大小缩小时,一些控件会移动到一个小的下拉部分。不幸的是,这会拆分相关控件,例如在下面的屏幕截图中,“按 ID 过滤”标签、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);

最佳答案

您可以使用 ToolStripControlHostwinforms TextBoxLabel 进行分组。例如

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

关于c# - 将 ToolStrip 上的相关控件分组,以便它们始终一起可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33091144/

相关文章:

c# - 单击任务栏中的按钮时,什么事件会发送到 Windows 窗体窗口?

c# - ListView 选定索引已更改

c# - .Net Toolstrip/MenuStrip 焦点问题

c# - 使用 .NET Core 2.2 发送电子邮件

c# - 必须在编排客户端上等待 StartNewAsync 吗?

visual-studio-2008 - 在 Windows 窗体设计器中将控件与窗体的中心对齐

c# - 在 ContextMenuStrip 中获取 ToolstripItem 的文本

c# - 如果另一个工具条位于同一个工具条面板上,则将工具条稍微向左移动会创建一个新行

c# - 关闭与 SQL Server 数据库的连接和连接数

c# - 使用 C# HttpListener 处理多个请求