考虑以下代码:
private async Task ShowOpenFileDialogAsync()
{
BrowserWindow? mainWindow = Electron.WindowManager.BrowserWindows.First();
OpenDialogOptions options = new()
{
Title = "Choose a file",
Properties = [OpenDialogProperty.openFile],
Filters = [new FileFilter { Name = "JSON Files", Extensions = ["json"] }]
};
await Electron.Dialog.ShowOpenDialogAsync(mainWindow, options);
Console.WriteLine("done");
}
这是从 Blazor 调用的,如下所示:
<button @onclick="ShowOpenFileDialogAsync">Open</button>
这将显示 打开文件对话框,但“完成”永远不会打印到控制台,表明
Electron.Dialog.ShowOpenDialogAsync
永远不会返回任何内容。
我是否遗漏了什么?我似乎找不到任何有关如何与对话框交互以了解此代码是否正确的文档。
注:
提到的问题是应用程序无法关闭其底层进程,并且应用程序无法在终端中打印信息,即使代码隐式声明应该执行此操作。为了确定问题,必须实例化符合问题中提到的规范的应用程序。遵循并应用了存储库中指定的步骤。结果并不令人满意,因为它导致错误说应用程序无法与 NodeJS 通信,并且当窗口关闭时,底层 Electron 进程没有关闭。
即使在官方存储库中提到支持.NET 8.0,但实际情况是它几乎不支持该版本。将应用程序切换到 .NET 6.0 版本后,错误较少,但它仍然没有显示 Electron 应用程序窗口,并且在应用程序关闭后仍然让底层 Electron 进程打开。为了找到 Blazor Server + Electron 应用程序的工作示例,我们进行了进一步的研究。找到样本后,前面提到的问题的原因也找到了。原因是应用程序没有正确初始化。
//Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
var builder = WebApplication.CreateBuilder(args);
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseElectron(args);
webBuilder.UseEnvironment("Development");
webBuilder.UseStartup<Startup>();
});
}
// Startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<WeatherForecastService>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
if (HybridSupport.IsElectronActive)
{
CreateWindow();
}
}
private async void CreateWindow()
{
var window = await Electron.WindowManager.CreateWindowAsync();
window.OnClosed += () => {
Electron.App.Quit();
};
}
}
使用上面所示的启动配置后,应用程序运行顺利且没有错误。基本操作错误的原因是由于运行时版本和启动配置错误造成的,这是由于官方文档中缺乏信息造成的。应用程序未关闭底层进程的问题是由于官方文档没有提供任何信息,说明必须将
OnClosed
事件附加到 Electron 窗口,该事件将在应用程序关闭底层 Electron 进程时关闭底层 Electron 进程。已关闭。
private async void CreateWindow()
{
var window = await Electron.WindowManager.CreateWindowAsync();
window.OnClosed += () => {
Electron.App.Quit();
};
}
官方文档中普遍缺乏必须提供的信息和指导。