MenuStrip控件的情况
基本菜单的边界
MDI的父窗口和子窗口中存在MenuStrip控件,子窗口在父窗口中表示的时候,子窗口的菜单会同父窗口的菜单结合(合并)在一起表示出来。
补充:当窗口中有复数个菜单的情况时,在Form.MainMenuStrip的属性中指定主菜单。在主窗口中合并在一起被表示。
到底合并以后被表示成什么样让我们来具体看一下。如下图所示,父窗口的top Menu中存在Item1和Item2,子窗口的top Menu中存在ChildItem1的时候,子窗口在父窗口中表示的时候,父窗口的top Menu中在末尾追加了ChildItem1。
子窗口中空菜单表示的解决方法
在子窗口中增加MenuStrip,父窗口的MenuStrip表示的情况下,子窗口的MenuStrip的Visible属性设置成false。如果设置成true不变的话,子窗口中的MenuStrip就会表示成空的菜单。
指定合并菜单的方法
ToolStripMenuItem类中的MergeAction和MergeIndex属性决定了菜单如何被合并在一起。下面对在MergeAction属性中可以被指定的枚举成员的值如何指定菜单合并逐一进行说明。
在一下的说明中,MDI的父窗口的Menu项目(ToolStripMenuItem)被成为父项目,子窗口中的Menu被称为子项目。
MergeAction.Append
子项目的MergeAction属性Append时,会在子项目菜单最后被追加。这个时候,MergeIndex属性的值会被无视。具体的话,如上图所示被合并在一起。
MergeAction.Insert
子项目的MergeAction属性Insert时,会在MergeIndex属性所制定的位置被插入。例如,子项目的MergeIndex被设为0会在Menu的开头被插入,1则在第二个位置被插入。子项目的MergeIndex的数目大于父项目的数目的时候则在最后的位置被插入。MergeIndex的值为-1时,子项目将不被表示。
之前的例子、ChildItem1的MergeAction被设为Insert、MergeIndex被设为1时,如下面的样子被合并。
MergeAction.Replace
子项目的MergeAction设置成Replace时,父项目中的项目将被子项目中MergeIndex指定的位置的内容所代替。若MergeIndex中该项目不存在的时候(包含-1的情况),将替代父项目中具有同样的Text属性的的内容。若找不到,则不表示子项目的内容。
如之前的例子,ChildItem1的MergeAction属性被设置成Replace,MergeIndex属性为1的时候,如下面的样子被合并表示。
MergeAction.Remove
子项目的MergeAction属性被设置为Remove时候,子项目的MergeIndex属性指定的位置的父项目将被消除。子项目也不表示。同Replace一样,MergeIndex属性找不到的时候,将会寻找同Text属性一致的项目。
如之前的例子,ChildItem1的MergeAction设置为Remove,MergeIndex设置为1的情况下,如下面一样被合并表示。
MergeAction.MatchOnly
子项目的MergeAction属性设置为MatchOnly的时候,子项目的MergeIndex属性指定位置的父项目的子菜单(Items属性中包含的项目)里,追加子项目的子菜单。子项目自身不表示,同Replace一样,MergeIndex属性找不到的情况下,将对Text属性进行匹配。
如前面的例子,ChildItem1的MergeAction属性设置为MatchOnly,MergeIndex设置为1的情况下,如下面一样被合并。Item21和Item22为原本在Item2中存在的项目,ChildItem11和ChildItem12为原本在ChildItem1中存在的项目。
MainMenu控件的情况
基本Menu的合并
MDI的父窗体和子窗体中存在MainMenu的控件,当子窗体在父窗体中表示的时候,父窗体的Menu中将子窗体的Menu合并表示。
补充:当窗体是复数个菜单的时候,主菜单通过Form.Menu属性来指定。在主窗体中合并表示。
如何合并表示让我们来具体看一下。如下图一样,父窗体的top Menu中存在MenuItem1和MenuItem2,子窗体的top Menu中存在ChildMenu1的时候,子窗体在父窗体内不表示的时候,父窗体的Top Menu的末尾将ChildMenu1追加上来。
指定合并菜单的插入位置
指定ChildMenu1的插入位置可以通过变更MenuItem.MergeOrder属性来实现。例如ChildMenu1要在MenuItem1和MenuItem2之间表示,
MenuItem1.MergeOrder = 0
MenuItem2.MergeOrder = 2
ChildMenu1.MergeOrder = 1
如上面一样、ChildMenu1的MergeOrder指定在MenuItem1和MenuItem2之间。也就是说,MergeOrder为Menu合并时候表示的顺序。
在一个Menu中合并
MenuItem1和ChildMenu1作为一个Menu显示时,MenuItem1和ChildMenu1的MergeOrder设置为同样的值,同时,MergeType设定适当的MenuMerge枚举类型的值。(MergeType的默认为Add,什么也不指定的情况下如最初的例子一样表示。)
MenuItem1和ChildMenu1的MergeOrder属性为同样值的时候,MergeType均为MergeItems的时候如下图一样合并表示。
MenuItem1和ChildMenu1的MergeOrder属性为相同值的时候,MenuItem1的MergeType为Replace,ChildMenu1的MergeItems为MergeItems的时候,MenuItem1不被表示。(也就是说MenuItem1被ChildItem1所置换。)
当MergeType属性为Remove的情况下,同MergeOrder一样,无论有没有,MenuItem都不会被表示。下图,MenuItem1和MenuItem2的MergeOrder为同样的值,同时子菜单的MenuItem11和ChildMenu11的MergeType属性为Remove。
补充:合并后的菜单可以通过Form.MergedMenu属性来取得。