原文地址:
分类:
在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函数,到时由父窗体直接调用就可以了