使用启动配置文件
使用 WinFormium 应用构造器 AppBuilder 的 UseWinFormiumApp<T>() 泛型方法传入启动配置类,启动配置类必须继承自 WinFormiumStartup 抽象类,该类主要用于配置 WinFormium 应用程序的初始化信息。
WinFormiumStartup 抽象类中包含了一系列的抽象方法和虚方法,您可以在子类中实现或重写这些方法来配置 WinFormium 应用程序的初始化信息。
配置应用程序的主窗体
使用 UseMainWindow 方法配置应用程序的主窗体,该方法接受一个 MainWindowOptions 参数,该参数包含了一系列的配置选项,您可以在这里配置应用程序的主窗体。
UseMainFormium
MainWindowOptions.UseMainFormium 方法接受一个泛型参数,该参数必须继承自 Formium 类,该类用于配置窗体的样式和主页地址。这个使用泛型参数的方法支持依赖注入,您可以在构造函数中注入您需要的服务。
protected override MainWindowCreationAction? UseMainWindow(MainWindowOptions opts){return opts.UseMainFormium<MyFormiumWin>();}
同时,MainWindowOptions.UseMainFormium还提供了一个重载方法,该方法接受一个 Formium 参数,您可以直接使用一个 Formium 派生类的实例。
protected override MainWindowCreationAction? UseMainWindow(MainWindowOptions opts){return opts.UseMainFormium(new MyFormiumWin());}
UseMainForm
如果您的应用程序需要以 Form 作为应用程序的主窗体,WinFormium 允许您使用普通 Form 作为主窗体。
UseMainForm 方法接收一个泛型参数,该参数继承自 Form 类。这个使用泛型参数的方法支持依赖注入,您可以在构造函数中注入您需要的服务。
protected override MainWindowCreationAction? UseMainWindow(MainWindowOptions opts){return opts.UseMainForm<MyForm>();}
同时,MainWindowOptions.UseMainForm 还提供了一个重载方法,该方法接受一个 Form 参数,您可以直接使用一个 Form 派生类的实例。
protected override MainWindowCreationAction? UseMainWindow(MainWindowOptions opts){return opts.UseMainForm(new MyForm());}
您需要在 UseMainWindow 方法中返回由 MainWindowOptions 参数提供的构架方法的返回值,这个返回值是一个 MainWindowCreationAction 类型的代理,在这个代理中包含了窗体创建的相关逻辑。
配置应用程序的主进程
使用 WinFormiumMain 方法配置应用程序的主进程,该方法接受一个 string[] 参数,该参数包含了应用程序启动时传入的命令行参数。
这个方法的作用是代替 WinForm 默认模板中的 Main 方法,在《概述》中简单介绍了 CEF 多进程架构的理论知识,在 CEF 的多进程架构中主进程和渲染进程是分开的,主进程中的某些代码不应该运行在渲染进程中,因此您应该将主进程中的代码放在 WinFormiumMain 方法中执行。
因为子进程的启动也会调用入口方法 Main,如果按以往的认识将主进程的某些代码放在 Main 方法中,那么子进程也会运行这些代码。例如,您在 WinFormium 应用程序的 Main 方法中初始化了 Quartz.net 组件来执行一些定时任务,但是子进程启动的时候同样会执行 Main 方法,这样 Quartz.net 组件就会在子进程中执行,这样就会导致子进程也执行了这些定时任务,这显然是不正确的。
因此,强烈建议将原有的 Main 方法中的代码放在 WinFormiumMain 方法中执行,这样可以防止子进程运行一些不正确的初始化代码。
protected override void WinFormiumMain(string[] args){// Main 函数中的代码应该在这里,该函数只在主进程中运行。// 这样可以防止子进程运行一些不正确的初始化代码。ApplicationConfiguration.Initialize();}
配置 Chromium Embedded Framework
使用 ConfigurationChromiumEmbedded 方法配置 Chromium Embedded Framework,该方法接受一个 ChromiumEnvironmentBuiler 参数,该参数包含了一系列的配置选项,您可以在这里配置 CEF 的运行环境或参数。
ConfigureCommandLineArguments
在使用任何基于 CEF 的框架时,配置 CEF 的命令行参数是必不可少的。在 WinFormium 中,您可以使用 Aciton<ConfigureCommandLineArguments> 方法配置 CEF 的命令行参数。
protected override void ConfigurationChromiumEmbedded(ChromiumEnvironmentBuiler cef){cef.ConfigureCommandLineArguments(cmdLine =>{cmdLine.AppendArgument("disable-web-security");cmdLine.AppendSwitch("no-proxy-server");});}
有关于 CEF 命令行参数的更多信息,请参阅《Chromium 命令行参数清单》。需要注意的是,该文档中列举的某些命令行参数并不适用于 CEF,因此您需要参考 CEF 的文档来了解 CEF 支持的命令行参数。
ConfigureDefaultSettings
使用 ConfigureDefaultSettings 方法配置 CEF 的默认设置,该方法接受一个 Action<CefSettings> 参数,该参数包含了一系列的配置选项,您可以在这里配置 CEF 的默认设置。
protected override void ConfigurationChromiumEmbedded(ChromiumEnvironmentBuiler cef){cef.ConfigureDefaultSettings(settings =>{settings.WindowlessRenderingEnabled = true;});}
ConfigureDefaultBrowserSettings
使用 ConfigureDefaultBrowserSettings 方法配置 CEF 的默认浏览器设置,该方法接受一个 Action<CefBrowserSettings> 参数,该参数包含了一系列的配置选项,您可以在这里配置 CEF 的默认浏览器设置。
protected override void ConfigurationChromiumEmbedded(ChromiumEnvironmentBuiler cef){cef.ConfigureDefaultBrowserSettings(settings =>{settings.BackgroundColor = new CefColor(0, 0, 0, 0);});}
ConfigureSubprocess
使用 ConfigureSubprocess 方法配置 CEF 的子进程,该方法接受一个 Action<SubprocessOptions> 参数,该参数包含了一系列的配置选项,您可以在这里配置 CEF 的子进程。
在 CEF 的多进程架构中主进程和渲染进程是分开的,默认情况下 CEF 启动多个当前可执行文件作为子进程,在《概述》中介绍 CEF 多进程架构的时候提到过,如果主应用程序可执行文件很大且逻辑很多的情况下,加载时间将很长,并且多次启动该可执行文件作为子进程还会占用过多内存,在这种情况下可以使用单独的可执行文件作为其子进程以加快应用程序的启动时间并减少内存的占用。
protected override void ConfigurationChromiumEmbedded(ChromiumEnvironmentBuiler cef){cef.ConfigureSubprocess(sub =>{// 指定 Subprocess 的文件路径sub.SubprocessFilePath = "WinFormiumSubProcess.exe";});}
上面代码示例中提到的 WinFormiumSubProcess.exe 就是为了分开主进程和渲染进程而单独创建的子进程可执行文件,您可以在《使用子进程》中了解如何创建独立的子进程可执行文件。
其他
ChromiumEnvironmentBuiler 参数还提供了很多其他的方法用于配置 CEF 的运行环境或参数,您可以参阅以下文档了解更多内容:
配置应用程序的服务
使用 ConfigureServices 方法配置应用程序的服务,该方法接受一个 IServiceCollection 参数,该参数包含了一系列的配置选项,您可以在这里配置应用程序的服务。
请注意,在 WinFormiumStartup 中的 ConfigureServices 方法中注册的服务只能在主进程中使用,如果您需要在所有进程中使用服务,请在 AppBuilder 中的 UseServices 方法中注册服务。但是请注意,在不同进程中注册的服务它们之间都是独立的,因此无法在主进程中调用子进程注册的服务,尽管这些服务的名称和类型都是相同的。
protected override void ConfigureServices(IServiceCollection services){// 注册嵌入资源services.AddEmbeddedFileResource(new EmbeddedFileResourceOptions{Scheme = "http",DomainName = "embedded.app.local",ResourceAssembly = typeof(Program).Assembly,EmbeddedResourceDirectoryName = "wwwroot",});// 注册本地资源services.AddLocalFileResource(new LocalFileResourceOptions{Scheme = "http",DomainName = "files.app.local",PhysicalFilePath = Path.Combine(AppContext.BaseDirectory, "wwwroot"),});// 注册 JavaScript Window Binding Objectservices.AddWindowBindingObject<TestWindowBindingObject>();}
