在WPF/MVVM/Caliburn设置中设置WebView2数据文件夹



我们有使用Caliburn/MVVM设置的WPF应用程序。
Bootstrapper中的ViewModel注册:

builder.RegisterType<CustomWebViewModel>().As<Screen>();  

CustomWebView.xamlWebView2的生成:

<Grid>
<wv2:WebView2 x:Name="WebView2" Source="{Binding WebAddress, Mode=OneWay, 
UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" />
</Grid>  

在开发环境应用程序运行顺利:WebView2显示正确的内容。
然而,在生产中,这个应用程序是安装在C:Program FilesCompanyProduct文件夹。
启动时抛出消息:

Microsoft Edge无法读写其数据目录:C:Program产品文件企业 Product.exe.WebView2 EBWebView

原因是WebView2需要被配置为使用应用程序有权限使用的数据文件夹。
这段代码做到了:

var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
var userDataFolder = System.IO.Path.Combine(appData, "CustomWebView2");
var task = await CoreWebView2Environment.CreateAsync(null, userDataFolder);
var webView2 = (WebView2)this.FindName("WebView2");
if (webView2 != null)
await webView2.EnsureCoreWebView2Async(task);

问题:在这个设置中,我在哪里调用这段代码?
我尝试了OnCoreWebView2InitializationCompletedOnContentLoading,但在这两种情况下,EnsureCoreWebView2Async抛出:

系统。ArgumentException: 'WebView2已被初始化不同CoreWebView2Environment。检查Source属性是否已经设置或EnsureCoreWebView2Async之前被调用不同的价值观。">

在设置WebView2控件的Source之前先调用EnsureCoreWebView2Async

因此从XAML标记中删除绑定:

<wv2:WebView2 x:Name="WebView2" />

…并通过编程方式设置:

var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
var userDataFolder = System.IO.Path.Combine(appData, "CustomWebView2");
var task = await CoreWebView2Environment.CreateAsync(null, userDataFolder);
var webView2 = (WebView2)this.FindName("WebView2");
if (webView2 != null)
{
await webView2.EnsureCoreWebView2Async(task);
webView2.SetBinding(WebView2.SourceProperty, new Binding("WebAddress"));
}

最新更新