使用Xamarin Forms WebView控件,我重寫了OnBackButtonPressed()並發現CanGoBack在UWP中總是返回false。Xamarin Forms WebView.CanGoBack總是返回false在UWP
我在Android中看不到這個問題。
這是一個XF錯誤還是我做錯了什麼?
注:我運行XF v2.3.3.193
編輯:我升級到XF 2.3.4.247和問題仍然存在。
使用Xamarin Forms WebView控件,我重寫了OnBackButtonPressed()並發現CanGoBack在UWP中總是返回false。Xamarin Forms WebView.CanGoBack總是返回false在UWP
我在Android中看不到這個問題。
這是一個XF錯誤還是我做錯了什麼?
注:我運行XF v2.3.3.193
編輯:我升級到XF 2.3.4.247和問題仍然存在。
我創建了一個代碼示例,並在WebView瀏覽多個網站時重現您的問題。我在Xamarin.Forms源代碼中發現了原因。當調用UpdateCanGoBackForward
方法
void UpdateCanGoBackForward()
{
((IWebViewController)Element).CanGoBack = Control.CanGoBack;
((IWebViewController)Element).CanGoForward = Control.CanGoForward;
}
的CanGoBack
屬性將被改變。只有在調用本地NavigationCompleted
事件時纔會調用UpdateCanGoBackForward
方法。因此,如果某個網站無法快速加載,則CanGoBack
屬性不會更改。
您可以通過自定義WebView改進此設計。你可以按照下面的代碼。
CustomWebView.cs
添加新的屬性CustomWebView
。
public class CustomWebView : WebView
{
public bool CCanGoBack { get; set; }
public CustomWebView()
{
}
}
CustomWebViewRenderer.cs
並更改屬性時ContentLoading事件被調用。
[assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))]
namespace CustomWebViewTest.UWP
{
public class CustomWebViewRenderer : WebViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if (Control != null)
{
Control.ContentLoading += Control_ContentLoading;
}
}
private void Control_ContentLoading(Windows.UI.Xaml.Controls.WebView sender, Windows.UI.Xaml.Controls.WebViewContentLoadingEventArgs args)
{
(Element as CustomWebView).CCanGoBack = Control.CanGoBack;
}
}
}
MainPage.cs
private void backClicked(object sender, EventArgs e)
{
if (Browser.CCanGoBack)
{
Browser.GoBack();
}
}
只是一個評論說,這雖然解決UWP,它打破了Android的(因爲我沒有對機器人定製呈現)。我不確定在Android渲染器中做什麼,而不是創建一個,我只是做一個RuntimePlatform檢查,並根據平臺檢查CCanGoBack或CanGoBack。 – erin