We have WPF app which is using Caliburn/MVVM setup.
ViewModel registration in Bootstrapper:
builder.RegisterType<CustomWebViewModel>().As<Screen>();
WebView2 creation in CustomWebView.xaml:
<Grid>
<wv2:WebView2 x:Name="WebView2" Source="{Binding WebAddress, Mode=OneWay,
UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" />
</Grid>
In developement environment app runs smoothly: WebView2 shows correct content.
However in production this app is installed in C:\Program Files\Company\Product\ folder.
When started it throws message:
Microsoft Edge can't read and write to its data directory: C:\Program Files\Company\Product\Product.exe.WebView2\EBWebView
The reason is that WebView2 needs to be configured to use data folder that app would have a permission to use.
This piece of code does it:
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);
Question: where do I call this piece of code in this setup?
I tried OnCoreWebView2InitializationCompleted and OnContentLoading but in both cases EnsureCoreWebView2Async throws:
System.ArgumentException: 'WebView2 was already initialized with a different CoreWebView2Environment. Check to see if the Source property was already set or EnsureCoreWebView2Async was previously called with different values.'
Call
EnsureCoreWebView2Asyncbefore you set theSourceof theWebView2control.So remove the binding from your XAML markup:
...and set it programmatically: