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():设置页导航入口与导航状态同步。STranslate/Views/WelcomeSetupWindow.xaml.cs
Settings.json、HotkeySettings.json、ServiceSettings.json 三个配置文件都不存在时自动打开;也可从关于页手动打开。窗口使用小尺寸纵向分页,第 1 页提供紧凑欢迎说明和语言选择。STranslate/Core/AppMessageBox.cs
STranslate/Helpers/UACHelper.cs
Run():通过 Host 进程按普通/提权/计划任务模式拉起应用。STranslate.Host/src/commands/start.rs
start 命令:延迟启动、等待旧进程退出、必要时清理旧进程。App.Main() 先调用 SingleInstance<App>.InitializeAsFirstInstance()。OnSecondAppStarted() 并退出;首实例执行 MainWindowViewModel.Show()。OnAfterUpdateFastCallback,把临时配置目录回迁到便携数据目录。NeedAdmin():若启动模式要求提权,先清理单实例资源,再交给 UACHelper 重启进程后当前实例返回。
UACHelper.Run(mode, waitPid: Environment.ProcessId, waitTimeoutSec: 6) 会把当前进程 ID 传给 Host。taskkill /PID <pid> /T /F,并输出 handover ... 报告。App 实例:从 AppStorage<T> 读取 Settings、HotkeySettings、ServiceSettings。App() 内配置 DI:注册核心服务(插件/服务管理、翻译链、HTTP、窗口 VM、更新、外部调用、数据库等)。OnStartup() 中顺序初始化:
PluginManager.LoadPlugins()ServiceManager.LoadServices()SqlService.InitializeDB()App 构造阶段记录到三类配置文件启动前都不存在,则在主窗口创建前打开欢迎向导;打开前只初始化语言资源,保证向导首页可切换语言。Save() 生成配置文件,后续启动按文件已存在不再自动弹出。Loaded 时执行延迟初始化:Settings.LazyInitialize(initializeLanguage: false)、HotkeySettings.LazyInitialize()、托盘提示、WebDav 后置备份上传,以及自动检查更新服务启动。Loaded 时执行完整 Settings.LazyInitialize()。ProcessExit、Application.Exit、SessionEnding 任一事件触发时统一进入 Dispose()。PluginManager.Dispose() 清理临时解压目录。NeedDelete/NeedUpgrade 标记)。SingleInstance<App>.Cleanup() 释放 Mutex 和命名管道。UACHelper.Run() 组装 Host start 命令参数:
--mode direct/elevated/task--delay <seconds>--wait-pid <pid>--wait-timeout <seconds>MainWindow:
OnLoaded() 会按 HideOnStartup 计算窗口位置并挂接窗口过程钩子。OnContentRendered() 决定首次显示或隐藏。OnDeactivated() 可按 HideWhenDeactivated 自动隐藏,避免 Alt-Tab 残留。SettingsWindow:
Navigate(tag) 根据页面类型从 DI 取页实例并注入到 RootFrame.Content。Ctrl+F 由 OnKeyDown 路由到当前页面的搜索框。WelcomeSetupWindow:
HotkeyControl;快捷键页只显示打开窗口、输入翻译、划词翻译、截图翻译、OCR、图片翻译、替换翻译。ContentDialog 必须显式绑定当前向导窗口作为 owner,避免无参 ShowAsync() 等待后续应用激活才显示。AppMessageBox:
AppMessageBox.Show(),不要直接调用 iNKORE MessageBox.Show()。Settings:主行为配置(窗口、主题、热键策略、网络、OCR/图像翻译参数等)。StartMode:普通启动、提权启动、计划任务启动。HotkeySettings:全局热键、软件内热键、增量翻译键、Ctrl+CC 配置。ServiceSettings:服务实例列表与特殊服务 ID(替换翻译、图片翻译)。DataLocation:便携/漫游目录选择、日志/缓存/配置路径、InfoFilePath 与 BackupFilePath。STranslate/App.xaml.csSTranslate/Core/ISingleInstanceApp.csSTranslate/Views/MainWindow.xaml.csSTranslate/Views/SettingsWindow.xaml.csSTranslate/Core/AppMessageBox.csSTranslate/Core/DataLocation.csSTranslate/Helpers/UACHelper.csSTranslate.Host/src/commands/start.rsApp() 的 ConfigureServices 注册,并在 OnStartup() 明确初始化顺序。RegisterDispatcherUnhandledException / RegisterTaskSchedulerUnhandledException。MainWindow.OnContentRendered() 与 MainWindowViewModel.UpdatePosition() 配合逻辑。App 中启动前配置文件存在性判断、主窗口创建时机和 WelcomeSetupWindow,避免用额外设置项控制是否已完成。SettingsWindow.xaml 菜单与 SettingsWindow.xaml.cs 的 Navigate 映射。AppMessageBox.Show(),保持活动窗口优先、透明 owner 兜底的策略。UACHelper.Run() 与 Host start 命令参数,确保主进程和 Host 协议一致。