簡體   English   中英

在 WPF/MVVM/Caliburn 設置中設置 WebView2 數據文件夾

[英]Set WebView2 data folder in WPF/MVVM/Caliburn setup

我們有使用 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 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);

問題:在這個設置中我在哪里調用這段代碼?
我嘗試OnCoreWebView2InitializationCompletedOnContentLoading但在這兩種情況下EnsureCoreWebView2Async拋出:

System.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"));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM