c# - 当 mdi child 最大化时,Winforms 删除控制框项目
问题描述
我的应用程序的父表单带有MenuStrip
,ToolStrip
和isMdiContainer=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;
}
我不希望任何人完成我的工作,我只想要解决方案。
解决方案
在将MenuStrip设置为父级的MainMenuStrip 属性的 MDI-Parent 上最大化 MDI-Childform 时,四个项目将添加到 MainMenuStrip。
- 一个“系统菜单”
- 一个“恢复按钮”
- “最小化按钮”
- 一个“关闭按钮”
第一个是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);
}
}
}
}
推荐阅读
- java - C 和 Java 中数据类型的大小?
- node.js - 如何删除 DynamoDB 中的多行?
- flutter - Flutter 与 Car Play 和 Android Auto 的兼容性
- javascript - 我们如何在 html 中为网页添加循环音乐?
- react-native - 未定义的'_this2.props.navigation.navigate'
- java - 如何解密从服务器接收到的字符串?
- c# - 尝试将文件上传到服务器
- android - NestedScrollView+RecyclerView 加载缓慢
- r - 在数据框中创建列作为 R 中条形图竞赛可视化的先前列的总和
- sparql - 如何为 Wikidata Sparql 查询找到正确的属性?