我们有使用Caliburn/MVVM设置的WPF应用程序。Bootstrapper
中的ViewModel
注册:
builder.RegisterType<CustomWebViewModel>().As<Screen>();
CustomWebView.xaml
中WebView2
的生成:
<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);
问题:在这个设置中,我在哪里调用这段代码?
我尝试了OnCoreWebView2InitializationCompleted
和OnContentLoading
,但在这两种情况下,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"));
}