如何在 MenuStrip LayoutStyle 设置为 Flow 的情况下将某些 MenuItems 右对齐?

How to align some MenuItems to the right with MenuStrip LayoutStyle set to Flow?

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

MenuStrip

如果我将 MenuStrip 的 LayoutStyle 设置为 StackWithOverFlow,我可以让它工作,但是如果 window 尺寸减小,菜单项就会被裁剪:

MenuStrip with LayoutStyle set to StackWithOverFlow

如何才能使菜单项在 MenuStrip LayoutStyle 设置为 Flow 的情况下右对齐?这样,当表单大小减小时,菜单项会转到下一行?

另外,当MenuStrip为更多菜单项换行时,如何使其他控件被向下推一点?

为了右对齐某些菜单项,您需要将项目的 Alignment 值设置为 Right。但是,右对齐仅适用于 StackWithOverflow 布局样式。如果您使用 Flow 对齐方式,则项目将始终从左到右排列。

此外,当您在 StackWithOverflow 布局样式中右对齐项目时,项目会从外向内流动,因此如果您的原始布局是 1 2 3 4 5,您的权利-对齐的项目将是 1 2 3 <gap> 5 4.

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

  1. 跟踪 SizeChanged 事件以确定您是否需要 FlowStackWithOverflow 基于所有菜单项的宽度和 window.

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

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

如果您有两个以上的项目,则必须更仔细地调整交换右对齐项目的过程。上面的代码只是简单地交换它们,但如果您有三个或更多项目,则需要完全颠倒它们的顺序。