首页 > 解决方案 > 当 mdi child 最大化时,Winforms 删除控制框项目

问题描述

我的应用程序的父表单带有MenuStrip,ToolStripisMdiContainer=true

我的Menu strip已与child form menu strip items.

当我从子表单打开子表单控件框时,显示了子表单。子图标显示在父项中Menu Strip,并显示控件。

我隐藏了所有,但在开始时再次显示。

我将 ControlBox、MinimizeBox、MaximizeBox、ShowIcon 设置为 false 并将 FormBorderStyle 设置为 none。

 private void partneriToolStripMenuItem_Click(object sender, EventArgs e)
 {
      ChildForm newMDIChild = new ChildForm();

      newMDIChild.Show();

      newMDIChild.MdiParent = this;
      newMDIChild.tsChilds.Visible = false;
      newMDIChild.WindowState = FormWindowState.Maximized;
      newMDIChild.FormBorderStyle = FormBorderStyle.None;
      newMDIChild.ControlBox = false;
      newMDIChild.MinimizeBox = false;
      newMDIChild.MaximizeBox = false;
      newMDIChild.ShowIcon = false;

 } 

我不希望任何人完成我的工作,我只想要解决方案。

标签: c#.netwinforms

解决方案


在将MenuStrip设置为父级的MainMenuStrip 属性的 MDI-Parent 上最大化 MDI-Childform 时,四个项目将添加到 MainMenuStrip。

  1. 一个“系统菜单”
  2. 一个“恢复按钮”
  3. “最小化按钮”
  4. 一个“关闭按钮”

第一个是System.Windows.Forms.MdiControlStrip+SystemMenuItem类型,其余三个是System.Windows.Forms.MdiControlStrip+ControlBoxMenuItem类型。您可以通过订阅菜单的 ItemAdded Event来观察这一点。您还可以使用此事件将这些项目的Visible属性设置为 false。这些项目类型没有公开暴露,因此必须使用反射来获取类型信息。

以下示例代码通过能够切换项目可见性的附加功能演示了这一点。

using System;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;

namespace WindowsFormsApp4
{
    public partial class MdiParent : Form
    {
        private int childIndex;
        private Type MdiControlStrip_SystemMenuItem;
        private Type MdiControlStrip_ControlBoxMenuItem;
        private bool mdiChildControlBoxEnabled = true;

        public MdiParent()
        {
            InitializeControls();
            Assembly asm = this.GetType().BaseType.Assembly;
            MdiControlStrip_SystemMenuItem = asm.GetType("System.Windows.Forms.MdiControlStrip+SystemMenuItem");
            MdiControlStrip_ControlBoxMenuItem = asm.GetType("System.Windows.Forms.MdiControlStrip+ControlBoxMenuItem");
        }

        private void InitializeControls()
        {
            SuspendLayout();
            Size = new Size(800, 400);
            Text = "MDI Parent";
            IsMdiContainer = true;
            MenuStrip menu = new MenuStrip { Dock = DockStyle.Top };
            ToolStripMenuItem addChild = new ToolStripMenuItem { Text = "Add Child", AutoSize = true };
            addChild.Click += (s, e) => { AddChildForm(); };
            menu.Items.Add(addChild);

            ToolStripMenuItem restoreChild = new ToolStripMenuItem { Text = "restore ActiveMdiChild", AutoSize = true };
            restoreChild.Click += (s, e) => { if (ActiveMdiChild != null) ActiveMdiChild.WindowState = FormWindowState.Normal; };
            menu.Items.Add(restoreChild);

            ToolStripMenuItem showChildControlBox = new ToolStripMenuItem { Text = "Show Child ControlBox - " + mdiChildControlBoxEnabled.ToString(), AutoSize = true };
            showChildControlBox.Click += (s,e) => {
                mdiChildControlBoxEnabled = !mdiChildControlBoxEnabled;
                showChildControlBox.Text = "Show Child ControlBox - " + mdiChildControlBoxEnabled.ToString();
                SetMDIMenuItemVisiblity(mdiChildControlBoxEnabled);
            };
            menu.Items.Add(showChildControlBox);

            Controls.Add(menu);
            MainMenuStrip = menu;
            MainMenuStrip.ItemAdded += MainMenuStrip_ItemAdded;
            ResumeLayout(true);
        }

        private void MainMenuStrip_ItemAdded(object sender, ToolStripItemEventArgs e)
        {
            if (!mdiChildControlBoxEnabled)
            {
                Type itemType = e.Item.GetType();
                if (itemType == MdiControlStrip_SystemMenuItem || itemType == MdiControlStrip_ControlBoxMenuItem)
                {
                    e.Item.Visible = false;
                }
            }
        }

        private void SetMDIMenuItemVisiblity(bool visible)
        {
            foreach (ToolStripMenuItem item in MainMenuStrip.Items)
            {
                Type itemType = item.GetType();
                if (itemType == MdiControlStrip_SystemMenuItem || itemType == MdiControlStrip_ControlBoxMenuItem)
                {
                    item.Visible = visible;
                }
            }
        }

        private void AddChildForm()
        {
            childIndex += 1;
            ChildForm cf = new ChildForm();
            cf.Text += childIndex.ToString();
            cf.MdiParent = this;
            cf.Show();
        }

        private class ChildForm : Form
        {
            public ChildForm()
            {
                SuspendLayout();
                Size = new Size(300, 200);
                Text = "MDI Child #";
                BackColor = Color.Bisque;
                MenuStrip menu = new MenuStrip { Dock = DockStyle.Top };
                ToolStripMenuItem someItem = new ToolStripMenuItem { Text = "Child Menu Item", AutoSize = true };
                menu.Items.Add(someItem);
                menu.Visible = false;
                Controls.Add(menu);

                ResumeLayout(true);
            }
        }
    }
}

演示 Gif


推荐阅读