博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)父子窗体的菜单合并及工具栏合并
阅读量:4544 次
发布时间:2019-06-08

本文共 1865 字,大约阅读时间需要 6 分钟。

原文地址:

分类:

在C#中创建的父子窗体默认可以自动合并菜单,但是其菜单的合并仅仅是将子窗体的菜单追加到父窗体菜单后面,要想灵活的控制子窗体菜单在父菜单中的位置,必须设置好MergeAction和MergeIndex两个属性。
 
父子窗体的菜单不会因为名字的相同而匹配,而是具有相同MergeIndex属性的相匹配,因此要想将两个菜单匹配起来,必须设置一致的MergeIndex值,匹配有五种模式,通过MergeAction来设定:Append,Insert,Replace,Remove和MatchOnly。
 
通常情况下,不用设置父窗体菜单的MergeAction。如果子窗体MergeAction为Append,则将菜单添加到父窗体菜单的后面(有可能是父窗体所有菜单的最后面,这也默认值),如果为Insert则插到其前面,Replace是替代,Remove则是将自己删除,MatchOnly则会合并,并将其所有的其子菜单都列于其下面(这也许是我们通常想要的,特别是在一级菜单中)。
 
好了,我想这样应该可以自由控制子窗体菜单在父窗体菜单中的位置了。
 
 
工具栏的合并就没这么简单了,这是因为它不会自动合并,也没有Merge之类的属性。
工具栏的合并有以下几种方法:
1.来自

在MDI窗体定义

        public interface ICipherInputForm

        {
            ToolStrip CipherToolStrip
            {
                get;
            }
        }

在MdiChildActivate事件中加入

         private void MainFrame_MdiChildActivate(object sender, EventArgs e)

        {

//CTools为MDI窗体工具栏

            ToolStripManager.RevertMerge(CTools);
            if (this.ActiveMdiChild != null)
            {
                if ((ActiveMdiChild as ICipherInputForm).CipherToolStrip != null)
                {
                    ToolStripManager.Merge((ActiveMdiChild as ICipherInputForm).CipherToolStrip,CTools);
                }
            }
            //若子窗体无工具栏时,隐藏该工具栏
            if (CTools.Items.Count > 0)
                CTools.Visible = true;
            else
                CTools.Visible = false;
         }

在子窗体

    public partial class FrmPowerTeam : Form,MainFrame.ICipherInputForm

    {

//Tools为你子窗体的工具栏.注意将其Visible = false;

        public ToolStrip CipherToolStrip
        {
            get
            {
                return Tools;
            }
        }
   }

2.来自

Mdi框架的子窗体菜单可以自动显示到主窗体的菜单栏里,但是子窗体的工具栏在显示的时候是不会自动合并到主窗体的工具栏中的。

  但是在运行的时候,只要把主窗体的工具栏动态替换为子窗体的工具栏对象,也就是从主窗体的Controls集合中删除主窗体原来的工具栏对象,再添加活动子窗体的工具栏对象,就可以把子窗体的工具栏显示在主窗体中,关闭子窗体的时候再把对应的工具栏从主窗体的Controls中删除。

  上面方法的效果是主窗体中总是显示一行工具栏。如果不删除主窗体Controls中原来已经存在的工具栏对象,在主窗体中就会出现两行工具栏。

  或者把子窗体的工具栏对象添加到主窗体的工具栏对象的Controls中,设置好子窗体工具栏对象的位置,就会模拟出合并工具栏的效果。

3.我倒是这么来解决的,直接把子窗体的工具栏内容写到父窗体中,但通常情况下是隐藏的,当触发MdiChildActivate事件时,判断子窗体是否为目标子窗体,如果是则将工具栏中相应的项目设为可见。这样做的一个缺点是许多对子窗体的多个判断,另外是属于子窗体的按钮被Click后需要在父窗体中操作子窗体,由于子窗体的private属性其也有一定的麻烦。解决方法是在子窗体中写好对应的public函数,到时由父窗体直接调用就可以了

转载于:https://www.cnblogs.com/liangyuhuidespace/archive/2013/03/12/2955496.html

你可能感兴趣的文章
Linux文件权限
查看>>
js替换字符串中特殊字符
查看>>
第一单元OO总结
查看>>
让 Windows7 - 64bit 支持 VC++ 6.0 的解决方法(无法启动此程序,因为计算机中丢失 MSVCRTD.dll。尝试重新安装该程序以解决此问题)...
查看>>
SSH 整合及注意事项
查看>>
带分页的sql语句
查看>>
CS231n Solver.py 详解
查看>>
OC内存管理
查看>>
使用FMDB事务批量更新数据库
查看>>
Android Fragment 真正的完全解析(上)
查看>>
C++面试宝典2011版
查看>>
Android学习笔记——ProgressBar
查看>>
Flume的监控参数
查看>>
第三天记录
查看>>
Centos下关于ssh、scp与rsync设置与应用
查看>>
排列组合+组合数取模 HDU 5894
查看>>
WCF(一) 创建第一个WCF
查看>>
hdu 6206 apple 点在内接圆外
查看>>
Jquery实现图片自动轮播
查看>>
第一篇:groovy对DSL的语法支持
查看>>