返回提交历史
Modified
XFEToolBox/Views/Windows/ToolCodeEditorWindow.xaml.cs
+56
-3
XFEstudio/XFEToolBox
引入 WebView2 环境复用机制提升启动体验
为 ToolCodeEditorWindow 实现 WebView2 环境复用,避免每次启动新建实例。新增 GetSharedWebViewEnvironmentAsync 和 CreateSharedWebViewEnvironmentAsync 方法,统一管理 user data 目录。初始化控件时传入共享环境,提升健壮性。增加 FormatWebViewInitializationError 方法,优化缺失运行时和权限问题的错误提示。调整 EnsureCoreWebView2Async 调用以适配共享环境。
af05532
代码差异
1 个文件
+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) =>