使用启动配置文件
使用 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 Object
services.AddWindowBindingObject<TestWindowBindingObject>();
}