我想让MenuStrip上的一些按钮与MenuStrip的右侧对齐。例如,菜单条右侧的Focus ON和Focus OFF:
菜单条
如果我将MenuStrip的LayoutStyle设置为StackWithOverFlow,我可以实现这一点,但如果窗口大小减小,菜单项就会被裁剪:
LayoutStyle设置为StackWithOverFlow 的MenuStrip
如何使菜单项与设置为Flow的MenuStrip LayoutStyle向右对齐?这样,当窗体大小减小时,菜单项会转到下一行吗?
此外,当MenuStrip为更多菜单项创建新行时,我如何确保其他控件被向下推一点?
为了右对齐某些菜单项,您需要将该项的Alignment值设置为right。但是,右对齐仅适用于StackWithOverflow布局样式。如果使用Flow对齐样式,则项目将始终从左向右流动。
此外,当您在StackWithOverflow布局样式中右对齐项目时,项目会从外向内流动,因此如果您的原始布局是1 2 3 4 5
,则右对齐项目将是1 2 3 <gap> 5 4
。
问题的解决方案分为两部分:
-
跟踪SizeChanged事件,根据所有菜单项的宽度和窗口的可用宽度来确定是否需要Flow或StackWithOverflow。
-
如果必须更改布局样式,请交换右对齐的项目,以便它们以正确的顺序显示在任一布局样式中。
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); } }
如果您有两个以上的项目,则必须更仔细地调整交换正确对齐项目的过程。上面的代码只是交换它们,但如果您有三个或三个以上的项目,则需要完全颠倒它们的顺序。