ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Electron.NET WindowManager 完全指南:窗口创建、生命周期管理与 BrowserView 集成

Electron.NET WindowManager 完全指南:窗口创建、生命周期管理与 BrowserView 集成 桌面应用跨平台【免费下载链接】Electron.NET:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).项目地址https://gitcode.com/gh_mirrors/el/Electron.NET点击查看免费下载Electron.WindowManager是 Electron.NET 中负责创建和管理浏览器窗口BrowserWindow与浏览器视图BrowserView的核心 API它覆盖了窗口创建、行为控制、外观定制以及与应用生命周期的协调。本文以官方文档 WindowManager.md 为主线结合仓库源码 WindowManager.cs、BrowserWindow.cs 与 BrowserWindowOptions.cs 等实现细节带你掌握窗口的完整控制链路读完即可写出可运行的多窗口、多视图桌面应用。概述WindowManager 的定位与访问方式Electron.WindowManager提供了对 Electron 应用中浏览器窗口的全面控制它负责窗口创建、窗口注册表维护以及与应用生命周期的协调。在 Electron.NET 中它是通过单例模式暴露给开发者的定义见 Electron.cs内部访问WindowManager.Instance单例public static WindowManager WindowManager { get { return WindowManager.Instance; } }也就是说在 ASP.NET Core 应用中你始终通过Electron.WindowManager静态入口访问无需自行 new 实例。该单例在构造时即订阅了BrowserWindowClosed与BrowserWindowRecreated两个桥接事件见 WindowManager.cs用于同步维护窗口集合保证BrowserWindows集合始终反映真实的打开状态。属性详解IReadOnlyCollectionBrowserView BrowserViews获取当前所有已打开浏览器视图的只读集合。视图在每次CreateBrowserViewAsync成功后会被追加到内部_browserViews列表并通过AsReadOnly()暴露源码。IReadOnlyCollectionBrowserWindow BrowserWindows获取当前所有已打开浏览器窗口的只读集合。该集合的增删由桥接事件驱动窗口创建成功BrowserWindowCreated后加入集合窗口关闭BrowserWindowClosed以int[]携带存活窗口 ID 列表时集合会移除不在存活列表中的窗口若收到空列表则清空整个集合HandleBrowserWindowClosed窗口被重建BrowserWindowRecreated时会补回集合HandleBrowserWindowRecreated。注意窗口关闭后的清理订阅使用的是持久化Socket.On而非一次性Socket.Once这是为了避免窗口集合在多次关闭后残留过期引用对应 GitHub issue #1008仓库通过 WindowManagerLifecycleTests.cs 对该行为做了回归校验。bool IsQuitOnWindowAllClosed控制当所有窗口关闭时应用是否退出默认值为true。设置该属性时值会立即通过quit-app-window-all-closed事件同步到 Electron 主进程源码因此它对运行中的 Electron 进程即刻生效Electron.WindowManager.IsQuitOnWindowAllClosed false; // 所有窗口关闭后保持应用运行方法详解TaskBrowserWindow CreateWindowAsync(string loadUrl http://localhost)使用默认BrowserWindowOptions创建窗口并加载指定 URL。一个关键实现细节当loadUrl恰为默认值http://localhost且当前运行于 ASP.NET 托管环境ElectronNetRuntime.AspNetWebPort有值时框架会自动补上端口号拼接为http://localhost:{port}从而直接加载你的 ASP.NET Core 应用源码。返回的TaskBrowserWindow在 Electron 主进程回传BrowserWindowCreated事件携带窗口 ID时完成ID 用于构造后续操作的句柄。TaskBrowserWindow CreateWindowAsync(BrowserWindowOptions options, string loadUrl http://localhost)使用自定义BrowserWindowOptions创建窗口。除同样支持端口自动拼接外该方法还内置了两处 Windows 10 / Electron 兼容性补偿对应 Electron issue #4045宽高补偿Windows 10 下创建窗口时Width 14、Height 7坐标补偿若显式指定了X/Y则X - 7源码。了解这些补偿逻辑有助于你在 Windows 10 上进行像素级定位调试时理解窗口位置与预期的偏差来源。TaskBrowserView CreateBrowserViewAsync()使用默认BrowserViewConstructorOptions创建浏览器视图。BrowserView是嵌入到BrowserWindow中的附加 Web 内容容器相当于相对于宿主窗口定位的子窗口是webview标签的替代方案见 BrowserView.cs。TaskBrowserView CreateBrowserViewAsync(BrowserViewConstructorOptions options)使用自定义选项创建浏览器视图目前支持配置WebPreferences以及代理相关快捷属性BrowserViewConstructorOptions.cs。创建成功后视图 ID 通过BrowserViewCreated事件回传并加入BrowserViews集合源码。值得一提的实现细节BrowserView的WebContents内部使用了id 1000作为 ID以避免与BrowserWindow的 ID 冲突见 BrowserView.cs。使用示例基础窗口创建// 使用默认选项创建窗口自动加载 ASP.NET 应用地址 var mainWindow await Electron.WindowManager.CreateWindowAsync(); // 使用自定义选项创建窗口加载指定 URL var settingsWindow await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions { Width 800, Height 600, Show false, Title Settings, WebPreferences new WebPreferences { NodeIntegration false, ContextIsolation true } }, https://localhost:5001/settings);窗口管理与生命周期协调// 获取所有打开的窗口 var windows Electron.WindowManager.BrowserWindows; Console.WriteLine($Open windows: {windows.Count}); // 配置退出行为所有窗口关闭后保持应用运行 Electron.WindowManager.IsQuitOnWindowAllClosed false; // 处理窗口生命周期 Electron.App.WindowAllClosed () { Console.WriteLine(All windows closed); if (Electron.WindowManager.IsQuitOnWindowAllClosed) { Electron.App.Quit(); } };这里需要说明App.WindowAllClosed事件的实际触发语义见 App.cs若IsQuitOnWindowAllClosed为true且当前不是 macOSElectron 默认会在所有窗口关闭时直接退出此时该事件不会触发只有当你把IsQuitOnWindowAllClosed设为false或在 macOS 上时事件才会回调从而让你自行决定是否调用Electron.App.Quit()。这也是文档示例中先判断标志位再退出的原因。BrowserView 集成// 创建浏览器视图 var browserView await Electron.WindowManager.CreateBrowserViewAsync(new BrowserViewConstructorOptions { WebPreferences new WebPreferences { NodeIntegration false, ContextIsolation true } }); // 挂载到窗口 mainWindow.SetBrowserView(browserView); await browserView.WebContents.LoadURLAsync(https://example.com); // 设置视图在窗口内的位置与尺寸 browserView.Bounds new Rectangle { X 0, Y 100, Width 800, Height 400 };对应源码中挂载动作通过browserWindow-setBrowserView桥接事件完成BrowserWindow.cs视图 bounds 则直接由BrowserView.Bounds属性 setter 通过browserView-bounds-set事件下发BrowserView.cs。BrowserView还支持SetAutoResize(AutoResizeOptions)与SetBackgroundColor(string)两个实验性方法BrowserView.cs。完整窗口选项配置var options new BrowserWindowOptions { Width 1200, Height 800, MinWidth 600, MinHeight 400, MaxWidth 1920, MaxHeight 1080, X 100, Y 100, Center true, Frame true, Title My Application, Icon assets/app-icon.png, Show false, AlwaysOnTop false, SkipTaskbar false, Kiosk false, TitleBarStyle TitleBarStyle.Default, BackgroundColor #FFFFFF, DarkTheme false, Transparent false, WebPreferences new WebPreferences { NodeIntegration false, ContextIsolation true, EnableWebSQL false, Partition persist:electron, ZoomFactor 1.0f, DevTools true } }; var win await Electron.WindowManager.CreateWindowAsync(options);多窗口应用// 创建主窗口 var mainWindow await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions { Width 1200, Height 800, Show false }); // 创建模态子窗口需设置 Parent var secondaryWindow await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions { Width 600, Height 400, Parent mainWindow, Modal true, Show false }); // 分别加载不同内容 await mainWindow.WebContents.LoadURLAsync(https://localhost:5001); await secondaryWindow.WebContents.LoadURLAsync(https://localhost:5001/settings); // 页面渲染完成后显示窗口避免视觉闪烁 mainWindow.OnReadyToShow () mainWindow.Show(); secondaryWindow.OnReadyToShow () secondaryWindow.Show();BrowserWindowOptions 参数深度剖析BrowserWindowOptions对应 Electron 的BrowserWindow构造参数完整定义见 BrowserWindowOptions.cs其 C# 属性默认值与 Electron 保持一致。以下按用途分组说明尺寸与位置属性说明默认值Width/Height窗口宽高像素800/600X/Y窗口距屏幕左/上的偏移可空不设置时窗口默认居中居中Center在屏幕中央显示窗口falseMinWidth/MinHeight窗口最小尺寸0MaxWidth/MaxHeight窗口最大尺寸无限制UseContentSize宽高是否按网页内容尺寸计算否则含窗口边框实际窗口会略大false窗口行为开关属性说明默认值Resizable是否可调整大小trueMovable/Minimizable/Maximizable/Closable是否可移动/最小化/最大化/关闭Linux 上未实现标有SupportedOSPlatform特性trueFocusable窗口是否可聚焦Windows 上设为false同时隐含SkipTaskbar truetrueAlwaysOnTop是否始终置顶falseFullscreen是否全屏显示显式false时 macOS 会隐藏/禁用全屏按钮falseFullscreenable是否允许进入全屏模式macOS 上还决定最大化/缩放按钮切换全屏还是最大化trueSkipTaskbar是否在任务栏显示macOS/WindowsfalseKiosk是否进入 kiosk 模式falseShow创建后是否立即显示设为false配合OnReadyToShow可避免白屏闪烁trueFrame设为false可创建无边框窗口trueModal是否为模态窗口仅对子窗口有效需配合ParentfalseHasShadow窗口是否带阴影trueDarkTheme强制深色主题仅部分 GTK3 桌面环境生效falseTransparent是否透明窗口false外观与标题属性说明默认值Title默认窗口标题Electron.NETIcon窗口图标Windows 推荐使用 ICO 文件未设置时使用可执行文件图标无TitleBarStyle标题栏样式Default、Hidden、HiddenInset、CustomButtonsOnHoverDefaultTitleBarOverlay无边框窗口的标题栏覆盖配置可false、true或自定义对象falseBackgroundColor窗口背景色支持 Hex/RGB/RGBA/HSL/HSLA/命名颜色#AARRGGBB需配合Transparent true#FFFOpacity窗口初始不透明度0.0~1.0仅 Windows/macOS无VibrancymacOS 毛玻璃效果类型无BackgroundMaterialWindows 系统绘制背景材质auto/none/mica/acrylic/tabbed无窗口类型与辅助能力Type窗口类型字符串、TrafficLightPositionmacOS 无边框窗口红绿灯位置、ThickFrameWindows 无边框窗口的WS_THICKFRAME默认true、RoundedCorners无边框圆角默认trueWindows 11 22000 以下版本无效、TabbingIdentifiermacOS 原生标签页分组、ZoomToPageWidth、SimpleFullscreen、HiddenInMissionControl、VisualEffectState、Proxy/ProxyCredentials创建时即设置的代理及凭据也可改用WebContents.SetProxyAsync等。WebPreferences渲染进程安全与功能配置WebPreferences控制窗口 Web 页面的功能开关是 Electron.NET 应用安全配置的关键完整定义见 WebPreferences.cs。核心选项如下NodeIntegration是否启用 Node 集成默认true注意Electron.NET 的 IPC 依赖 Node 桥接关闭前请确认 IPC 场景建议对加载不可信内容的窗口显式设为false。ContextIsolation是否在独立上下文中运行 preload 脚本与 Electron API默认false加载潜在不受信任的远程内容时建议开启true防止页面篡改 preload 脚本。Sandbox是否启用渲染进程沙箱Electron 20 默认启用NodeIntegration true时会自动关闭沙箱。DevTools是否允许 DevTools默认true设为false后openDevTools()无法使用。Partition会话分区字符串以persist:开头为持久会话否则为内存会话相同 partition 的页面共享同一 Session。Preloadpreload 脚本绝对路径即使关闭 Node 集成也能向全局作用域注入受限的 Node 能力。ZoomFactor页面默认缩放因子3.0 表示 300%默认1.0。Javascript/Images/Webgl/Webaudio/Plugins分别控制 JavaScript、图片、WebGL、WebAudio、插件支持前几项默认truePlugins默认false。WebSecurity同源策略开关默认true禁用会同时将AllowRunningInsecureContent置true。WebviewTag是否允许webview标签默认false。EnableRemoteModule是否启用 remote 模块默认false。BackgroundThrottling页面进入后台时是否节流动画与定时器默认true。EnablePreferredSizeMode启用 preferred size 模式页面尺寸变化时触发preferred-size-changed事件默认false。EnableBlinkFeatures/DisableBlinkFeatures以逗号分隔的 Blink 特性字符串如CSSVariables,KeyboardEventKey启用/禁用列表。DefaultFontFamily/DefaultFontSize16/DefaultMonospaceFontSize13/MinimumFontSize0/DefaultEncodingISO-8859-1字体与编码相关。ScrollBouncemacOS 橡皮筋滚动、Offscreen离屏渲染、ExperimentalFeatures、ImageAnimationPolicyanimate/animateOnce/noAnimation等实验与平台特性。窗口生命周期事件与运行时控制BrowserWindow实例提供了丰富的事件与命令方法定义见 BrowserWindow.cs。常用事件包括OnReadyToShow页面已渲染完成、可无闪烁地显示窗口配合Show false使用OnClose/OnClosed窗口即将关闭/已关闭后者收到后应移除对窗口的引用OnShow/OnHide、OnFocus/OnBlur显隐与聚焦变化OnMaximize/OnUnmaximize/OnMinimize/OnRestore最大化/最小化状态变化OnResize/OnMove/OnMoved/OnBoundsChanged尺寸、位置与 bounds 变化OnBoundsChanged携带Rectangle省去额外调用GetBoundsAsync的往返OnEnterFullScreen/OnLeaveFullScreen与OnEnterHtmlFullScreen/OnLeaveHtmlFullScreen系统级与 HTML API 触发的全屏进出OnUnresponsive/OnResponsive网页无响应与恢复OnPageTitleUpdated文档标题变化平台专属OnSessionEndWindows 关机/注销、OnAppCommandWindows/Linux 键盘媒体键与鼠标后退键、OnSwipe/OnSheetBegin/OnSheetEnd/OnNewWindowForTabmacOS。运行期控制方法包括显隐与聚焦Show()、ShowInactive()、Hide()、Focus()、Blur()、IsFocusedAsync()、IsVisibleAsync()尺寸与位置SetBounds(Rectangle)、SetContentBounds(...)、SetSize(...)、SetPosition(...)、SetMinimumSize(...)、SetMaximumSize(...)、Center()以及对应的Get*Async()查询状态切换Maximize()/Minimize()/Restore()/Unmaximize()、SetFullScreen(bool)、SetKiosk(bool)、SetResizable(bool)、SetAlwaysOnTop(bool[, level[, relativeLevel]])level 可选值见 OnTopLevel关闭控制Close()相当于用户点击关闭按钮网页可取消与Destroy()强制销毁保证closed事件一定触发内容与交互LoadURL(url[, options])、Reload()、SetTitle(...)、FlashFrame(bool)、SetProgressBar(double[, ProgressBarOptions])Windows 任务栏进度条、SetIgnoreMouseEvents(bool)、SetContentProtection(bool)防止屏幕捕获父子窗口SetParentWindow(BrowserWindow)、GetParentWindowAsync()、GetChildWindowsAsync()菜单与任务栏WindowsSetMenu(MenuItem[])、SetThumbarButtonsAsync(...)、SetThumbnailClip(...)、SetAppDetails(...)等。底层工作原理.NET 与 Electron 的桥接从源码可以看出WindowManager的一切能力都建立在BridgeConnector.Socket的 Socket.IO 桥接之上WindowManager.cs创建流程C# 侧构造TaskCompletionSource向主进程Emit(createBrowserWindow, options, loadUrl)或createBrowserViewElectron 主进程创建窗口/视图后回发BrowserWindowCreated/BrowserViewCreated事件携带 IDC# 侧据此构造BrowserWindow/BrowserView代理对象并完成 Task。集合同步BrowserWindowClosed存活 ID 数组与BrowserWindowRecreated事件驱动BrowserWindows集合的增删保证只读集合与真实窗口状态一致该订阅是持久化的Socket.On避免一次性订阅导致的窗口引用泄漏issue #1008。退出策略同步IsQuitOnWindowAllClosed的 setter 通过quit-app-window-all-closed事件实时同步到主进程而App.WindowAllClosed的触发条件由该标志位与当前操作系统共同决定App.cs。相关 APIElectron.App应用生命周期与窗口级事件如WindowAllClosed、BeforeQuitElectron.Dialog模态对话框需要指定父窗口Electron.Menu窗口级菜单栏配置Electron.WebContents窗口内容加载、导航与渲染控制。进一步探索完整 API 概览见 docs/API/Overview.md多窗口与多视图的集成测试可参考 WindowManagerLifecycleTests.csWebApp 示例中的窗口管理用法见 WindowsController.cs窗口生命周期的桥接实现主进程侧见 browserWindows.ts。赞分享桌面应用跨平台【免费下载链接】Electron.NET:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).项目地址https://gitcode.com/gh_mirrors/el/Electron.NET点击查看免费下载相关推荐掌握libui窗口生命周期管理从创建到销毁的完整指南掌握libui窗口生命周期管理从创建到销毁的完整指南 libui是一个简单且可移植的GUI库使用C语言编写它能利用每个平台的原生GUI技术创建界面。本指南桌面应用UI组件Cherry Studio WindowManager API 完全参考窗口生命周期、初始化数据与 IPC 契约Cherry Studio WindowManager API 完全参考窗口生命周期、初始化数据与 IPC 契约 本篇技术指南以 Cherry Studio人工智能大模型AI 应用交互助手本地部署NW.js窗口事件处理终极指南从创建到关闭的完整生命周期管理NW.js窗口事件处理终极指南从创建到关闭的完整生命周期管理 NW.js是一款强大的框架允许开发者直接从DOM/WebWorker调用所有Node.js模块桌面应用跨平台上一篇Aurelia 1框架社区贡献指南如何参与开源项目下一篇无需复杂配置zerolog日志高效转发至Logstash实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表