详细论述制作网站的步骤,泉州网站制作案例,网络推广十大平台,本地黄页小程序我们在控件那篇文章里说过#xff0c;窗体和控件都是一个类#xff0c;项目中一个个窗体#xff0c;都是Form类的子类。关于这个类有几个重要的成员#xff0c;也是最常用成员#xff0c;以供初学者了解#xff1a;Load事件#xff1a;发生在构造函数后#xff0c;Show…我们在控件那篇文章里说过窗体和控件都是一个类项目中一个个窗体都是Form类的子类。关于这个类有几个重要的成员也是最常用成员以供初学者了解Load事件发生在构造函数后Shown事件前这个事件的生命周期内窗体是不可视化的。Shown事件当窗体发生前窗体有轮廓画出事件结束后整个窗体渲染完并显示。FormClosing事件当窗体关闭过程中触发因为是中间过程还有机会挽救事件订阅方法的第二个参数是FormClosingEventArgs它有一个Cancel属性如果设置成true窗体就停止关闭后续步骤继续显示。FormClosed事件窗体关闭后触发不过这个事件走完后窗体才消失这个事件订阅方法的第二个参数是FormClosedEventArgs它有一个CloseReason的属性说明了窗体关闭的原因是枚举类型。Show方法以非模态方式显示窗体意思就是显示出来的窗体与其他可视窗体可以切换操作非模态窗体关闭后就会释放。ShowDialog方法以模态方式显示窗体会阻塞之前显示的窗体独占进程内的输入设置焦点。Hide方法隐藏当前窗体可以通过Show或ShowDialog再次显示出来。Close方法关闭当前窗体会触发Close的相关事件。MDI多文档界面MDI窗体如下通常把主窗体当做父MDI窗体其他窗体是子MDI窗体。首先设置主窗体的IsMdiContainer属性为True当显示子MDI窗体时首先实例化然后指定子窗体的MdiParent为主窗体实例因为在主窗体中new的所以指定为this当前对象。var child02 new Child02Form();
child02.MdiParent this;
child02.WindowState FormWindowState.Maximized;
child02.Show();WinForm中的DI依赖注入的方便性大家可能在asp.net core中体会到了所以前一段时间有公众号微友想了解在WinForm中使用依赖注入这个必须安排。其实WinForm中使用DI和asp.net core是一样的要安装NuGet包Microsoft.Extensions.Hosting为了演示日志这里引入了NLog。using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using System;namespace WinFormDemo07
{internal static class Program{[STAThread]static void Main(){ApplicationConfiguration.Initialize();var host CreateHostBuilder().Build();ServiceProvider host.Services;Application.Run(ServiceProvider.GetRequiredServiceMainForm());}public static IServiceProvider ServiceProvider { get; private set; }static IHostBuilder CreateHostBuilder(){return Host.CreateDefaultBuilder().ConfigureServices((context, services) {services.AddLogging(loggingBuilder {loggingBuilder.ClearProviders();loggingBuilder.SetMinimumLevel(LogLevel.Information);loggingBuilder.AddNLog(nlog.config);});services.AddTransientMainForm();services.AddTransientChild01Form();services.AddTransientChild02Form();services.AddTransientIDataService, DataService();});}}public interface IDataService{bool ModifyData(string name);}public class DataService : IDataService{public bool ModifyData(string name){return false;}}
}在使用时可以通过构造函数把注入的服务窗体拿出来使用还可以用Program中提供的静态ServiceProvider的GetRequiredService来获取容器中的实例。当然注入的时候要根据自己的需要把服务注入成SingletonScoped或Transient。public partial class MainForm : Form
{private readonly IDataService _dataService;private readonly ILoggerMainForm _logger;private readonly Child01Form _childo1form;public MainForm(Child01Form childo1form, ILoggerMainForm logger,IDataService dataService){_logger logger;_dataService dataService; _childo1form childo1form;_logger.LogInformation(MainForm 启动); InitializeComponent();} private void 新建NToolStripMenuItem_Click(object sender, EventArgs e){_logger.LogInformation(child01form 启动);var child01 Program.ServiceProvider.GetRequiredServiceChild01Form()child01.MdiParent this;child01.WindowState FormWindowState.Maximized;child01.Show();}
}