src/docs/runtime-bootstrap.md
Main() 到主窗口可用的完整启动链路。STranslate/App.xaml.cs
Main():单实例判定、Velopack 回调、管理员模式启动判定。App() 构造函数:读取三类设置并注册 DI。OnStartup():插件/服务/数据库初始化,窗口创建与启动后延迟初始化。Register*Exception()、RegisterExitEvents()、Dispose():异常与退出收敛。STranslate/Core/ISingleInstanceApp.cs
SingleInstance<TApplication>.InitializeAsFirstInstance():Mutex + NamedPipe 单实例通知。STranslate/Views/MainWindow.xaml.cs
OnLoaded()、OnContentRendered()、OnDeactivated()、Dispose()。STranslate/Views/SettingsWindow.xaml.cs
Navigate():设置页导航入口与导航状态同步。App.Main() 先调用 SingleInstance<App>.InitializeAsFirstInstance()。OnSecondAppStarted() 并退出;首实例执行 MainWindowViewModel.Show()。OnAfterUpdateFastCallback,把临时配置目录回迁到便携数据目录。NeedAdmin():若启动模式要求提权,交给 UACHelper 重启进程后当前实例返回。App 实例:从 AppStorage<T> 读取 Settings、HotkeySettings、ServiceSettings。App() 内配置 DI:注册核心服务(插件/服务管理、翻译链、HTTP、窗口 VM、更新、外部调用、数据库等)。OnStartup() 中顺序初始化:
PluginManager.LoadPlugins()ServiceManager.LoadServices()SqlService.InitializeDB()Loaded 时执行延迟初始化:Settings.LazyInitialize()、HotkeySettings.LazyInitialize()、托盘提示、WebDav 后置备份上传,以及自动检查更新服务启动。ProcessExit、Application.Exit、SessionEnding 任一事件触发时统一进入 Dispose()。PluginManager.Dispose() 清理临时解压目录。NeedDelete/NeedUpgrade 标记)。MainWindow:
OnLoaded() 会按 HideOnStartup 计算窗口位置并挂接窗口过程钩子。OnContentRendered() 决定首次显示或隐藏。OnDeactivated() 可按 HideWhenDeactivated 自动隐藏,避免 Alt-Tab 残留。SettingsWindow:
Navigate(tag) 根据页面类型从 DI 取页实例并注入到 RootFrame.Content。Ctrl+F 由 OnKeyDown 路由到当前页面的搜索框。Settings:主行为配置(窗口、主题、热键策略、网络、OCR/图像翻译参数等)。HotkeySettings:全局热键、软件内热键、增量翻译键、Ctrl+CC 配置。ServiceSettings:服务实例列表与特殊服务 ID(替换翻译、图片翻译)。DataLocation:便携/漫游目录选择、日志/缓存/配置路径、InfoFilePath 与 BackupFilePath。STranslate/App.xaml.csSTranslate/Core/ISingleInstanceApp.csSTranslate/Views/MainWindow.xaml.csSTranslate/Views/SettingsWindow.xaml.csSTranslate/Core/DataLocation.csApp() 的 ConfigureServices 注册,并在 OnStartup() 明确初始化顺序。RegisterDispatcherUnhandledException / RegisterTaskSchedulerUnhandledException。MainWindow.OnContentRendered() 与 MainWindowViewModel.UpdatePosition() 配合逻辑。SettingsWindow.xaml 菜单与 SettingsWindow.xaml.cs 的 Navigate 映射。