基于.NET的Windows窗体编程之WinForms菜单工具栏


在我们常见的软件中,菜单栏,工具栏,状态栏,以及右键弹出的上下文菜单,基本属于是一个软件的标配,如WPS,Microsoft Office组件,IE浏览器,Visual Studio等,使用这些组件布局系统,不仅可以提高使用便捷性,合理利用页面空间,由于符合Windows用户操作习惯,还能让用户快速上手。今天我们以一些简单的小例子,简述基于.NET的Windows窗体编程中菜单栏,工具栏,状态栏,以及上下文菜单的常见用法,仅供学习分享使用,如有不足之处,还请指正。

 

 

概述

 

在软件布局中,菜单栏(MenuStrip),工具栏(ToolStrip),状态栏(StatusStrip),快捷菜单(ContextMenuStrip),这几个组件通常组合使用,有时还会配合多窗口(MDI),实现更复杂的UI布局,这几个组件既是基础组件,也是必须要掌握的核心组件。常见的组件如下:

  • MenuStrip,表示一个Form表单中的菜单框架容器,可以往里面添加ToolStripMenuItem类型的菜单项,每一个菜单项可以执行相应的命令,或者包含其他子菜单项。
  • ToolStrip ,此控件及其关联的类提供了一个通用框架,用于将用户界面元素合并到工具栏、状态栏和菜单。可以使用ToolStrip来跨容器显示通用用户界面,创建易于自定义的常用工具栏。
  • ContextMenuStrip,表示上下文菜单,它不可以独立存在,必须依附于某一个控件,在点击控件右键的时候弹出。
  • StatusStrip,表示状态栏,此控件用于窗体中某个区域,通常显示在窗口底部,应用程序可以在此区域显示各种状态信息。
  • MDI窗口,正常创建出来的窗体都是单一窗口(Single-Document-Interface),而MDI窗口,又称多文档界面窗体 (Multiple-Document-Interface ),用于同时显示多个文档,MDI 子窗体的创建避免了用户打开很多窗口的时候任务栏中挤满了窗体。

 

MenuStrip

 

MenuStrip,表示一个Form表单中的菜单框架容器,可以往里面添加ToolStripMenuItem类型的菜单项,每一个菜单项可以执行相应的命令,或者包含其他子菜单项。

MenuStrip的关键属性:

  • Items,表示MenuStrip的菜单项列表,它是ToolStripItemCollection类型,可以用于获取所有的菜单项,它支持ToolStripMenuItem,ToolStripComboBox,ToolStripTextBox三种子类型添加。
  • ToolStripMenuItem,表示MenuStrip中的菜单项,它也包含DropDownItems属性,用于添加子菜单项,而DropDownItems属性是ToolStripItemCollection类型,它支持ToolStripMenuItem,ToolStripComboBox,ToolStripTextBox,ToolStripSepator四种子类型。
  • ItemClicked,表示MenuStrip中的菜单项被点击时触发的事件,通过此事件可以处理菜单点击后的业务。且此事件参数为ToolStripItemClickedEventArgs类型,此类型包含ClickedItem属性,表示点击的菜单项。
  • MdiWindowListItem,表示是MDI窗口打开时,显示的已经打开的子窗口列表,默认为空,需要手动添加。

 

首先拖动MenuStrip控件到Form表单中,并修改Name属性,将其命名为menuStrip。默认情况下,拖动MenuStrip到Form表单中,会自动将Form的MainMenuStrip属性设置为此MenuStrip菜单,如果运行程序时没有显示添加的菜单,可以手动设置,如下所示:

 

 

选择menuStrip控件,在点击右侧的“黑色右三角”在弹出的MenuStrip任务菜单中,点击“编辑项…”,弹出“项集合编辑器”对话框,如下所示:

 

 

在打开的“项集合编辑器”窗口中,选择要添加的项(共有四种:MenuItem,ComboBox,TextBox),然后点击“添加(A)”按钮。选择添加的菜单项,可以在右侧弹出的属性窗口中,修改相应属性(如:Name),如下所示:

 

在菜单项属性窗口中,可以通过Text修改显示的文本,格式为“文本(&键)”,其中键为快捷键,默认是“Alt+快捷键”的组合键代替鼠标点击,如下所示:

 

 

选择添加的菜单项,在右侧的属性窗口中,选择DropDownItems,点击右侧的“…”按钮,打开菜单项的“项集合编辑器”对话框,如下所示:

 

 

在打开的子菜单项的“项集合编辑器”对话框中,选择添加的子菜单项,然后点击“添加(A)”按钮。子菜单项添加后,可以在右侧的属性窗口中,修改相应的属性(如:Name,Text,DropDownItems等),如下所示:

 

 

说明:所有的控件的Name属性,在Form范围内,必须具备唯一性。

 

插入标准项,WinForms框架为我们提供了基于Windows操作系统的标准项菜单,选择menuStrip控件,在点击右侧的“黑色右三角”在弹出的MenuStrip任务菜单中,点击“插入标准项”如下所示:

 

 

插入的标准项菜单,在“项集合编辑器”中可以看到添加的菜单项,显示如下所示:

 

 

运行程序,添加的标准项菜单如下所示:

 

 

说明:MenuStrip控件默认Dock属性为Top,会自动放置在Form窗体的最顶端。

 

ToolStrip

 

ToolStrip控件及其关联的类提供了一个通用框架,可以使用ToolStrip来跨容器显示通用用户界面,创建易于自定义的常用工具栏。

首先拖动ToolStrip工具栏到Form表单中,并命名为toolStrip,选择toolStrip控件,然后点击右侧的“黑色右三角”,在弹出的ToolStrip任务菜单中,点击“编辑项…”,如下所示:

 

 

在弹出的“项集合编辑器”窗口中,选择需要添加工具项,然后点击“添加(A)”按钮,添加后工具项后,在右侧的属性对话框中,可以修改工具项的相关属性,如:Name,Text,Image,DisplayStyle等。

其中关键属性如下:

  • Image,设置工具栏按钮的图标
  • Text,设置工具栏字项的文本。
  • DisplayStyle,设置显示样式,主要有几个选项:None,Text(只显示文本),Image(只显示图标),ImageAndText(文本和图标都显示)。
  • TextImageRelation,设置图标和文本的关系,主要有几个选项:Overlay,ImageAboveText,TextAboveImage,ImageBeforeText,TextBeforeImage。

 

 

标准项工具栏,WinForms框架为我们提供了基于Windows操作系统的标准项工具栏,选择toolStrip控件,在点击右侧的“黑色小三角”在弹出的ToolStrip任务菜单中,点击“插入标准项”如下所示:

 

 

在ToolStrip的“项集合编辑器”窗口中,查看插入的标准项工具栏,如下所示:

 

 

运行程序,添加的标准项工具栏如下所示:

 

 

ContextMenuStrip

 

ContextMenuStrip控件提供了一个快捷菜单,可以将其与控件相关联。当用户单击控件的鼠标右键时,快捷菜单(也称为上下文菜单)显示在鼠标位置。 快捷菜单为工作区或鼠标指针位置处的控件提供选项。

 

首先拖动ContextMenuStrip控件到Form表单中,并命名为contextMenuStrip,由于ContextMenuStrip组件不能独立存在,只会显示在Form表单的底部,先选择控件,点击控件的右侧上方“黑色右三角”,在弹出的“ContextMenuStrip任务”窗口中,点击“编辑项…”,如下所示:

 

 

在弹出的“项集合编辑器”窗口中,选择需要添加的项(它支持ToolStripMenuItem,ToolStripComboBox,ToolStripTextBox,ToolStripSepator四种子类型),然后点击“添加”,并在右侧属性窗口中,修改添加的项的属性,如:Name,Text等,如下所示:

 

 

将Form表单中的控件或Form表单本身的ContextMenuStrip属性绑定到contextMenuStrip控件,如下所示:

 

 

当运行程序时,在Form表单的空白处,点击鼠标右键,将会弹出对应的“上下文菜单”,如下所示:

 

 

StatusStrip

 

StatusStrip控件用于窗体中某个区域,通常显示在窗口底部,应用程序可以在此区域显示各种状态信息。StatusStrip组件支持四种子控件类型,如下所示:

  • ToolStripStatusLabel 主要显示状态文本,也可以显示图像。
  • ToolStripDropDownButton,表示点击此按钮会弹出下拉选项的的按钮列表。
  • ToolStripSplitButton,表示分隔按钮。
  • ToolStripProgressBar ,表示进度条,用于显示程序运行的状态。

 

拖动StatusStrip控件到Form表单中,并命名为statusStrip,然后选中此控件,在点击控件右侧的“黑色右三角”,在弹出的“StatusStrip任务”窗口中,点击“编辑项…”,如下所示:

 

 

在弹出的“项集合编辑器”窗口中,选择需要添加的项,然后点击“添加(A)”按钮,状态栏控件项添加后,可以在右侧的属性窗口中,修改控件的属性,如下所示:

 

 

MDI窗体

 

正常创建出来的窗体都是单一窗口(Single-Document-Interface),而MDI窗口,又称多文档界面窗体 (Multiple-Document-Interface ),用于同时显示多个文档,MDI 子窗体的创建避免了用户打开很多窗口的时候任务栏中挤满了窗体。MDI窗口常用的属性有以下几个:

  • IsMdiContainer,用于设置主窗体,是否为MDI容器,只有设置为true,才能做为MDI容器,否则就是单一窗体。
  • MdiParent,设置子窗体所属的MDI容器页面,设置完成后,此窗体就做为MDI窗体的一部分。
  • MdiChildren,表示此MDI容器已经包含的子窗体列表。

 

首先设置要作为容器的窗体的IsMdiContainer属性为true,可以通过属性栏进行设置,如下图所示:

 

 

添加菜单栏,通过工具箱拖动MenuStrip控件到MDI主窗体,菜单栏的Dock属性默认为Top,可以根据实际需要进行修改。

为菜单栏添加菜单,可以通过点击MenuStrip右侧的[小三角],在弹出的MenuStrip任务菜单,然后点击[编辑项…],打开项集合编辑器,如下所示:

 

 

本示例添加三个菜单,分别用于打开三个窗口。为MenuStrip添加ItemClicked事件,并添加如下业务逻辑代码:

 

private void menuWin_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
	Form form = null;
	var item = e.ClickedItem.Text;
	if(item == "窗口1")
	{
		form = new FirstForm();
	}
	if (item == "窗口2")
	{
		form = new SecondForm();
	}
	if (item == "窗口3")
	{
		form = new ThirdForm();          
	}
	if (form != null)
	{
		form.Text = item;
		form.Width = 300;
		form.Height = 300;
		form.MdiParent = this;
		form.Show();
	}
}

 

在上述代码中,主要根据不同的菜单项,打开不同的窗体,并设置窗体的大小,标题,MdiParent属性,然后调用Show方法进行展示。

设置MenuStrip的MdiWindowListItem属性,显示MDI容器中已经加载的窗体列表。在窗体初始化或Load事件中添加如下代码:

 

ToolStripMenuItem window=new ToolStripMenuItem("Window");
this.menuWin.MdiWindowListItem=window;
this.menuWin.Items.Add(window);

 

MdiWindowListItem初始化成功后,在添加MDI子窗体时,会自动添加到MdiWindowListItem的子项中。

经过上述步骤基于MenuStrip+MDI开发的布局已经基本完成,运行程序后,点击菜单栏,打开窗口,默认如下所示:

 

 

窗口最大化,可以通过Window中的子项进行切换窗口,如下所示:

 

 

窗体最小化,默认情况下,最小化时停靠在容器底部(可以通过属性【MdiChildrenMinimizedAnchorBottom】进行修改),同时也可通过点击还原恢复正常窗口大小,如下所示:

 

 

Windows Form的MDI窗体提供了4种布局方式,分别为:

  • Cascade,所有的MDI子窗体,叠加的显示在容器中,用户可以进行拖动调整位置,此为默认布局。
  • TileHorizontal,所有的MDI子窗体,以水平平铺的方式显示在容器中。
  • TileVertical,所有的MDI子窗体,以垂直平铺的方式显示在容器中。
  • ArrangeIcons,所有的MDI子窗体,以排列图标的方式显示在容器中。

 

Cascade层叠布局,如下所示:

 

TileHorizontal水平平铺,如下所示:

 

 

TileVertical垂直平铺方式,如下所示:

 

 

以上就是《基于.NET的Windows窗体编程之WinForms菜单工具栏》的全部内容,希望可以抛砖引玉,一起学习,共同进步。

文章摘自:https://www.cnblogs.com/hsiang/p/20191909