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 EnsureCoreWebView2Async
before you set the Source
of the WebView2
control.
So remove the binding from your XAML markup:
<wv2:WebView2 x:Name="WebView2" />
...and set it programmatically:
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"));
}