创建 C# 应用程序
[[academy-video-youtube({"vid": "0zLZQesgV5o", "start_time": "0", "title": "创建 C# 应用程序", "creator": "Tim Corey", "length": "1 小时 35 分钟"})]]
Windows Forms App 是一种图形用户界面 API,是微软 .NET Framework 的一部分。 它为创建丰富的桌面应用程序提供了一个平台,Tim Corey 的视频"Intro to Windows Forms in .NET 6"全面介绍了如何使用该技术构建应用程序。 受 Tim 视频的启发,下面将深入介绍视频中涉及的概念。
Windows 窗体入门
Tim Corey 从在 .NET 6 中建立一个新的 Windows 窗体项目开始他的教程。起点包括在 Visual Studio 中通过选择创建创建一个新项目,然后选择适当的模板,最后设置初始窗体 (Form1)。 这对于初学者了解如何启动一个项目并运行他们的第一个表单至关重要。
设置项目:
蒂姆介绍了在 Visual Studio 中创建新项目的过程,强调了为 Windows 窗体应用程序选择正确模板和配置的重要性。 这包括选择 "Windows 窗体应用程序 "类型,适当命名项目,在本例中命名为 "WinFormsDemoApp",并选择 .NET 6.0 作为目标框架(2:05)。

在项目窗口中点击创建后,您会在代码编辑器左侧的解决方案资源管理器窗口中发现一个默认的 Windows 窗体,其中包含所有模板文件。 默认窗体基于基本的 Windows 用户界面结构,标题栏包含 Windows 窗体应用程序的标题以及最小化、最大化和关闭按钮控件。

使用 Windows 窗体快速开发应用程序
Tim 在视频中探讨了使用 Windows 窗体进行快速应用程序开发 (RAD) 的概念,强调了它在创建原型和概念验证方面的简便性和高效性。
了解快速应用程序开发
Tim 首先讨论了 RAD 的概念,RAD 的重点是快速开发应用程序,以验证想法和功能。
创建概念验证
1.利用工具箱窗口:Tim 演示了开发人员如何利用 Visual Studio 中的工具箱窗口,该窗口包含应用程序开发所必需的各种控件。
2.拖放功能:他说明了通过将控件(如按钮、文本框、标签和复选框)拖放到设计表面来添加控件的过程。
构建基本应用程序
1.布局和设计:Tim 解释了在窗体上安排控件的灵活性,以及使用 Visual Studio 的对齐指南对齐控件。
2.复制和粘贴控件:他展示了开发人员如何使用 Ctrl+C 和 Ctrl+V 等键盘快捷键快速复制控件,从而简化设计流程。
功能要素
1.配置控件:Tim 举例说明了如何通过直接在属性窗口中调整属性来配置进度条等控件。 该交互演示了应用程序可视化组件的实时变化。
2.交互式预览:通过运行应用程序,Tim 展示了如何交互式使用这些基本组件,即使它们的功能尚未完全实现。

设计人员出错
Tim Corey 解释了 Windows 窗体设计器可能出现故障的各种方式,以及开发人员通常会如何遇到这个问题。
意外修改:如果开发人员不小心删除或修改了 Form1.Designer.cs 中自动生成代码的关键部分(如事件处理程序或控件初始化代码),则可能导致设计器失败。
- 代码更改不一致:当手工编辑的代码与设计人员生成的代码不一致时,可能会出现错误。 例如,在一个局部类(Form1.cs)中移除事件处理程序,而在另一个局部类(Form1.Designer.cs)中不移除事件处理程序,可能会导致不匹配,从而使表单无法在设计器中正确加载。
阅读错误信息
Tim Corey 强调,在处理与 Windows 窗体设计器相关的问题时,仔细解读 Visual Studio 提供的错误信息非常重要。
错误消息详情:Tim 着重强调了具体的错误消息,例如 "设计器无法处理第 153 行的未知名称 'form1_load'",这些错误消息指出了设计器遇到问题的位置和原因。
- 解决指南:错误信息通常会提供可操作的步骤,例如恢复对生成代码所做的更改或确保所有部分类(Form1.cs 和 Form1.Designer.cs)的一致性。
从其他部分类中移除事件处理程序
Tim 演示了一个实用的解决方案,用于解决因表单的部分类之间事件处理程序修改不一致而导致的设计者问题。
示例场景:他解释了在一个局部类 (Form1.cs) 中删除事件处理程序 (Form1_Load) 而不在另一个局部类 (Form1.Designer.cs) 中删除事件处理程序 (Form1_Load) 会如何破坏设计器正确加载表单的能力。
- 统一修改:通过确保在两个部分类中一致地应用所有修改,开发人员可以有效地恢复 Windows 窗体设计器的功能,而无需采取重启 Visual Studio 或重新创建项目等极端措施。
在 Windows 窗体中处理其他事件
1.事件处理机制
Tim 解释了 Windows 窗体中的事件处理机制。 在使用 Windows 窗体设计器时,Tim 注意到双击一个控件(就像窗体本身一样)会为该控件生成一个默认事件处理程序。 例如,双击表单会创建一个加载事件处理程序。 Tim 警告说,如果开发人员删除处理程序内部的代码而不删除事件处理程序本身,就会破坏设计器中的表单渲染。 这是因为设计人员要将可视化布局翻译成代码,这对于表单在运行时正确呈现至关重要。
2.将表单理解为一个类
Tim 详细说明, Windows 窗体本质上是继承自 Form 的类,提供诸如窗体布局、窗口管理(最小化、最大化、关闭按钮)、调整大小功能等。 据 Tim 介绍,这种继承允许开发人员利用预置的 UI 组件(Button、TextBox、Label 等),并通过修改它们的属性和方法对其进行操作。
3.操作属性
在 29:16 分的视频中,Tim Corey 演示了 Windows 窗体中的属性(在 Visual Studio 的属性窗口中可见)如何使开发人员能够配置标签(文本属性)、按钮(文本属性、单击事件)和进度条(值属性)等可视化元素。 Tim 强调,这些属性可以在设计时和运行时修改,从而影响控件的行为和在表单上的显示方式。
4. 创建多个实例 5.
Tim 解释说,在 Windows 窗体中,每个窗体(Form1、Form2 等)是一个类(Form)的实例。 通过动态创建多个实例,开发人员可以有效管理应用程序中的多个窗口。 Tim 认为,这种功能有助于快速应用程序开发 (RAD),可以快速设计、定制和互连表单,从而构建复杂的用户界面。
5.应用程序启动配置
Program.cs 中的 Main 方法通过使用 Application.Run(new Form1()) 指定首先初始化哪个窗体(Form1、Form2 等),从而确定应用程序的起点。 Tim 强调指出,改变这种启动形式会改变用户启动应用程序时的初始视图,从而影响应用程序的流程和用户体验。
Windows 窗体中的菜单和工具栏
Tim 通过展示菜单和工具栏,展示了 WinForms 的多功能性。 他解释了在表单中添加和自定义这些元素是多么容易。 以下是 Tim 介绍的要点:
添加状态条
Tim Corey 演示了如何通过向窗体添加 StatusStrip 控件来增强用户交互。 该控件包括诸如 ToolStripProgressBar 和 ToolStripStatusLabel 之类的组件。 通过利用 Visual Studio 中的拖放功能,开发人员可以快速整合这些元素,以显示动态信息,如任务或状态消息中的进度更新。
自定义菜单条
Corey 强调在为 Windows 窗体应用程序设计菜单条时遵循 Windows 标准的重要性(MenuStrip)。 他解释了如何使用"&"来指定键盘快捷方式,以及如何使用下划线"_"来实现可访问性,确保用户可以使用键盘命令浏览菜单。 例如,将带 &Exit 下划线的 &File 指定为 E,可以让用户快速访问和执行命令,而无需依赖鼠标交互。
创建子菜单和事件
Corey 阐述了如何在 MenuStrip 下创建子菜单并将事件与菜单项关联。 通过双击菜单项,开发人员可以生成事件处理程序,并实现如显示消息(this.Close())等功能。 他强调了采用正确的命名约定和最佳实践对保持代码可读性和可扩展性的重要性。

最佳实践和技巧,作者:Tim Corey
Tim Corey 强调,在开始 WinForms 项目时,应将默认窗体 (Form1) 重命名为更有意义的名称,如 MainForm(1:02:01)。 这一简单步骤可确保整个项目的一致性,无缝更新代码库中的引用。
自定义表单属性
接下来,Tim 强调了早期自定义表单属性的重要性。 调整表单本身的文本属性以反映其目的(例如,"Main Form by Tim Corey")可增强 Visual Studio 环境中的清晰度和条理性。 此外,要适当设置字体大小(通常在 14-18 点左右)和表单大小(宽度和高度),以确保可读性,同时不影响其他控件的布局。
管理控制属性
Corey 强调了在添加控件后更改全表单设置时默认控件属性的陷阱。 然后,他在表单中添加了一个标签、文本框和一个按钮,并演示了表单会自动选择字体大小。 他演示了修改字体大小对所有控件的影响,并敦促开发人员尽早建立这些设置,以避免日后出现意外的布局变化。 如果您更改了每个控件的属性值,那么它就不会使用表单的默认值(1:06:33)。
控件命名约定
从 Tim 的视频中获得的主要启示之一是对控件使用有意义的命名约定。 与传统的 "lblFirstName "或 "txtFirstName "不同,Corey 主张对变量(firstNameLabel、firstNameTextBox)使用驼峰字母大小写,并在控件名称后加后缀。
事件处理和命名约定
Tim 倡导的一个显著做法是以一致的方式命名控件和处理事件。 通过从一开始就直观地命名控件(sayHelloButton、firstNameTextBox),开发人员可以简化事件处理。 这种方法可以防止在跨表单处理多个事件时出现混淆,并加强可维护性。
他通过展示适当命名按钮与保留按钮 1、按钮 2 等默认值之间的区别来证明这一点。这种方法符合现代编码实践,允许快速搜索并提高可读性,让人更容易一目了然地理解每个控件的用途。
实现选项卡顺序和可访问性
另一个关键方面是设置控件的制表符顺序。 Tim 解释了如何使用 TabIndex 属性来确保用户可以通过 Tab 键逻辑地导航窗体。 这不仅能增强用户体验,还能提高依赖键盘导航的用户的可访问性。
在表单之间传递数据
在扩展 WinForms 的功能时,Tim 谈到了在多个表单之间传递数据。 他演示了如何在表单中定义构造函数,以方便数据交换。 该技术允许开发人员使用特定数据初始化新表单,提高了应用程序设计的灵活性。
结论
Tim Corey 的《.NET 6 中的 Windows 窗体》教程是任何希望学习使用 C# 开发桌面应用程序的人的宝贵资源。 视频涵盖了从基本设置到高级控件和最佳实践的广泛主题,为创建专业的 Windows 窗体 C# 应用程序打下了坚实的基础。
如需了解更多上下文的详细说明和额外的实践编码示例,您可以观看 Tim Corey 的完整教程视频此处。

