XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEToolBox

【WPF】XFE工具箱

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEToolBox

引入 WebView2 环境复用机制提升启动体验

为 ToolCodeEditorWindow 实现 WebView2 环境复用,避免每次启动新建实例。新增 GetSharedWebViewEnvironmentAsync 和 CreateSharedWebViewEnvironmentAsync 方法,统一管理 user data 目录。初始化控件时传入共享环境,提升健壮性。增加 FormatWebViewInitializationError 方法,优化缺失运行时和权限问题的错误提示。调整 EnsureCoreWebView2Async 调用以适配共享环境。

af05532
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

1 个文件 +56 -3
Modified XFEToolBox/Views/Windows/ToolCodeEditorWindow.xaml.cs +56 -3
@@ -34,6 +34,10 @@ namespace XFEToolBox.Client.Views.Windows;
34 34
35 35 public partial class ToolCodeEditorWindow : Window
36 36 {
37 private const int EAccessDenied = unchecked((int)0x80070005);
38 private static readonly object WebViewEnvironmentSync = new();
39 private static Task<CoreWebView2Environment>? _sharedWebViewEnvironmentTask;
40
37 41 private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web)
38 42 {
39 43 PropertyNameCaseInsensitive = true
@@ -167,7 +171,8 @@ public partial class ToolCodeEditorWindow : Window
167 171 await ReloadFileListAsync();
168 172
169 173 SetHostStatus("正在启动 Monaco Editor…");
170 await EditorWebView.EnsureCoreWebView2Async();
174 var webViewEnvironment = await GetSharedWebViewEnvironmentAsync();
175 await EditorWebView.EnsureCoreWebView2Async(webViewEnvironment);
171 176 var editorAssets = Path.Combine(AppContext.BaseDirectory, "Resources", "Editor");
172 177 if (!File.Exists(Path.Combine(editorAssets, "editor.html")))
173 178 throw new FileNotFoundException("找不到本地 Monaco 编辑器资源。", editorAssets);
@@ -190,11 +195,58 @@ public partial class ToolCodeEditorWindow : Window
190 195 }
191 196 catch (Exception exception)
192 197 {
193 EditorLoadingDetail.Text = $"编辑器启动失败:{exception.Message}\n请确认已安装 Microsoft Edge WebView2 Runtime。";
198 EditorLoadingDetail.Text = FormatWebViewInitializationError(exception);
194 199 SetHostStatus("启动失败");
195 200 }
196 201 }
197 202
203 private static Task<CoreWebView2Environment> GetSharedWebViewEnvironmentAsync()
204 {
205 lock (WebViewEnvironmentSync)
206 {
207 if (_sharedWebViewEnvironmentTask is null
208 || _sharedWebViewEnvironmentTask.IsCanceled
209 || _sharedWebViewEnvironmentTask.IsFaulted)
210 _sharedWebViewEnvironmentTask = CreateSharedWebViewEnvironmentAsync();
211 return _sharedWebViewEnvironmentTask;
212 }
213 }
214
215 private static async Task<CoreWebView2Environment> CreateSharedWebViewEnvironmentAsync()
216 {
217 var userDataFolder = GetWebViewUserDataFolder();
218 Directory.CreateDirectory(userDataFolder);
219
220 var writeProbePath = Path.Combine(userDataFolder, $".write-probe-{Guid.NewGuid():N}.tmp");
221 using (new FileStream(
222 writeProbePath,
223 FileMode.CreateNew,
224 FileAccess.Write,
225 FileShare.None,
226 bufferSize: 1,
227 FileOptions.DeleteOnClose))
228 {
229 }
230
231 return await CoreWebView2Environment.CreateAsync(
232 browserExecutableFolder: null,
233 userDataFolder: userDataFolder);
234 }
235
236 private static string FormatWebViewInitializationError(Exception exception)
237 {
238 if (exception is WebView2RuntimeNotFoundException)
239 return "编辑器启动失败:未检测到 Microsoft Edge WebView2 Runtime。\n请安装或修复 WebView2 Runtime 后重试。";
240
241 if (exception is UnauthorizedAccessException || exception.HResult == EAccessDenied)
242 return $"编辑器启动失败:WebView2 缓存目录拒绝访问。\n目录:{GetWebViewUserDataFolder()}\n请确认当前用户对该目录具有读写权限。";
243
244 return $"编辑器启动失败:{exception.Message}\nWebView2 缓存目录:{GetWebViewUserDataFolder()}";
245 }
246
247 private static string GetWebViewUserDataFolder() =>
248 Path.Combine(AppPath.AppLocalData, "WebView2", "CodeEditor");
249
198 250 private async void CoreWebView2_WebMessageReceived(object? sender, CoreWebView2WebMessageReceivedEventArgs e)
199 251 {
200 252 try
@@ -863,7 +915,8 @@ public partial class ToolCodeEditorWindow : Window
863 915 {
864 916 if (!_markdownPreviewInitialized)
865 917 {
866 await MarkdownPreviewWebView.EnsureCoreWebView2Async();
918 var webViewEnvironment = await GetSharedWebViewEnvironmentAsync();
919 await MarkdownPreviewWebView.EnsureCoreWebView2Async(webViewEnvironment);
867 920 MarkdownPreviewWebView.CoreWebView2.Settings.AreDefaultContextMenusEnabled = true;
868 921 MarkdownPreviewWebView.CoreWebView2.Settings.AreDevToolsEnabled = false;
869 922 MarkdownPreviewWebView.CoreWebView2.NewWindowRequested += (_, args) =>