我們有使用 Caliburn/MVVM 設定的 WPF 應用程式。
ViewModel
注冊Bootstrapper
:
builder.RegisterType<CustomWebViewModel>().As<Screen>();
WebView2
創作于CustomWebView.xaml
:
<Grid>
<wv2:WebView2 x:Name="WebView2" Source="{Binding WebAddress, Mode=OneWay,
UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" />
</Grid>
在開發環境中應用程式運行流暢:WebView2
顯示正確的內容。
但是在生產中,此應用程式安裝在C:\Program Files\Company\Product\
檔案夾中。
啟動時會拋出訊息:
Microsoft Edge 無法讀取和寫入其資料目錄:C:\Program Files\Company\Product\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
拋出:
System.ArgumentException: ' WebView2 已經用不同的 CoreWebView2Environment 進行了初始化。檢查 Source 屬性是否已設定,或者 EnsureCoreWebView2Async 之前是否使用不同的值呼叫過。
uj5u.com熱心網友回復:
在設定控制元件EnsureCoreWebView2Async
之前呼叫。Source
WebView2
因此,從 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"));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494739.html