如何将MenuStrip LayoutStyle设置为Flow,将一些MenuItems对齐?

时间:2015-11-03 15:13:26

标签: c# menuitem flow menustrip

我想这样做,以便MenuStrip上的一些按钮与MenuStrip的右侧对齐。例如,菜单条右侧的Focus ON和Focus OFF:

this

如果我将MenuStrip的LayoutStyle设置为StackWithOverFlow,我可以使用它,但是如果窗口大小减小,菜单项会被裁剪:

MenuStrip

我怎样才能将菜单项对齐,将MenuStrip LayoutStyle设置为Flow?这样,当表单大小减少时,菜单项会转到下一行吗?

另外,当MenuStrip为更多菜单项换行时,如何才能将其他控件按下一点?

1 个答案:

答案 0 :(得分:3)

要右对齐某些菜单项,您需要将项目的对齐值设置为正确。但是,右对齐仅适用于 StackWithOverflow 布局样式。如果您使用 Flow 对齐样式,则项目将始终从左向右流动。

此外,当您在 StackWithOverflow 布局样式中右对齐项目时,项目从外部流入,因此如果您的原始布局为1 2 3 4 5,则右对齐项目将为1 2 3 <gap> 5 4

您的问题的解决方案分为两部分:

  1. 跟踪 SizeChanged 事件,根据所有菜单项的宽度和可用内容确定是否需要 Flow StackWithOverflow 窗户的宽度。

  2. 如果必须更改布局样式,请交换右对齐的项目,以便它们在任一布局样式中以正确的顺序显示。

    private void Form1_SizeChanged(object sender, EventArgs e)
    {
        int width = 0;
    
        // add up the width of all items in the menu strip
        foreach (ToolStripItem item in menuStrip1.Items)
            width += item.Width;
    
        // get the current layout style
        ToolStripLayoutStyle oldStyle = menuStrip1.LayoutStyle;
    
        // determine the new layout style
        ToolStripLayoutStyle newStyle = (width < this.ClientSize.Width)
            ? menuStrip1.LayoutStyle = ToolStripLayoutStyle.StackWithOverflow
            : menuStrip1.LayoutStyle = ToolStripLayoutStyle.Flow;
    
        // do we need to change layout styles?
        if (oldStyle != newStyle)
        {
            // update the layout style
            menuStrip1.LayoutStyle = newStyle;
    
            // swap the last item with the second-to-last item
            int last = menuStrip1.Items.Count - 1;
            ToolStripItem item = menuStrip1.Items[last];
            menuStrip1.Items.RemoveAt(last);
            menuStrip1.Items.Insert(last - 1, item);
        }
    }
    
  3. 如果您有两个以上的项目,则必须更仔细地调整交换右对齐项目的过程。上面的代码只是交换它们,但如果您有三个或更多项目,则需要完全撤销其订单。