我在Droid项目中有一个带有HybridWebView和HybridWebViewRenderer的Xamarin.Forms应用程序。
当我按下设备的后退按钮时,我试图让网页视图导航回来。
如果我只是在页面中使用Xamarin.Forms WebView,那看起来很简单。我会这样做......
protected override bool OnBackButtonPressed()
{
_webView.GoBack();
return true;
}
但是HybridWebView没有GoBack()方法。
在我的Droid项目中,唯一可以访问WebView的地方是HybridWebViewRenderer,但是我不能在这里监听OnBackButtonPressed事件。
任何人都知道如何在按下设备的后退按钮时将HybridWebView导航回去?
答案 0 :(得分:2)
从Javascript调用.Select(d => System.Data.Entity.DbFunctions.TruncateTime(d.DateOfEntry))
.Where(d => d.HasValue)
.Select(d => d.Value)
.ToList();
可能是一个肮脏的解决方案。
此外,从PCL类调用渲染器方法应该不是问题。
PCL课程:
window.history.back();
渲染器:
public class MyHybridWebView : HybridWebView
{
public event EventHandler<EventArgs> DoSomeNative;
public void CallNative()
{
DoSomeNative(this, EventArgs.Empty);
}
}
答案 1 :(得分:0)
我有效的解决方案如下:
HybridWebView扩展了View: 我创建了2个事件监听器和1个bool属性。
public event EventHandler<EventArgs> GoBackOnNativeEventListener;
public event EventHandler<EventArgs> CanGoBackOnNativeEventListener;
public bool _CanGoBack { get; set; }
方法:
public bool GoBack()
{
GoBackOnNative();
return true;
}
private void GoBackOnNative()
{
GoBackOnNativeEventListener(this, EventArgs.Empty);
}
public bool CanGoBack()
{
CanGoBackOnNative();
return _CanGoBack;
}
private void CanGoBackOnNative()
{
CanGoBackOnNativeEventListener(this, EventArgs.Empty);
}
在iOS渲染中 公共类WebViewRender:HybridWebViewRenderer { 受保护的重写void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); if(控件!= null && e.NewElement!= null) { InitializeCommands((ClickableWebView)e.NewElement); } }
private void InitializeCommands(ClickableWebView element)
{
element.RefreshCommand = () =>
{
Control?.Reload();
};
element.GoBackCommand = () =>
{
var ctrl = Control;
if (ctrl == null)
return;
if (ctrl.CanGoBack)
ctrl.GoBack();
};
element.CanGoBackFunction = () =>
{
var ctrl = Control;
if (ctrl == null)
return false;
return ctrl.CanGoBack;
};
element.CanGoForwardFunction = () =>
{
var ctrl = Control;
if (ctrl == null)
return false;
return ctrl.CanGoForward;
};
element.GoFrowardCommand = () =>
{
var ctrl = Control;
if (ctrl == null)
return;
if (ctrl.CanGoForward)
ctrl.GoForward();
};
}
}
在渲染器上,我绑定了侦听器:
e.NewElement.GoBackOnNativeEventListener += (sender, args) =>
{
Control.GoBack();
};
e.NewElement.CanGoBackOnNativeEventListener += (sender, args) =>
{
_cangoback = Control.CanGoBack();
var hybridWebView = Element as HybridWebView;
hybridWebView._CanGoBack = _cangoback;
};
最后在xaml.cs上,在方法OnBackButtonPressed()上,我喜欢:
if (hybridWebView.CanGoBack())
{
hybridWebView.GoBack();
return true;
}
else
return base.OnBackButtonPressed();