【发布时间】:2015-11-24 21:49:02
【问题描述】:
是否可以获取WebView中显示的网页信息?
【问题讨论】:
标签: xamarin xamarin.forms webview
是否可以获取WebView中显示的网页信息?
【问题讨论】:
标签: xamarin xamarin.forms webview
使用WebView自定义渲染器(https://developer.xamarin.com/guides/cross-platform/xamarin-forms/custom-renderer/):
public class TitleWebView : Xamarin.Forms.WebView
{
public static readonly BindableProperty PageTitleProperty = BindableProperty.Create<TitleWebView, string>(v => v.PageTitle, null, BindingMode.OneWayToSource);
public string PageTitle
{
get { return (string)GetValue(PageTitleProperty); }
set { SetValue (PageTitleProperty, value); }
}
}
Android 渲染器:
public class TitleWebViewRenderer : WebViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
if (e.OldElement == null)
{
Control.SetWebViewClient(new TitleWebViewClient(this));
}
}
internal class TitleWebViewClient : WebViewClient
{
readonly TitleWebViewRenderer titleWebViewRenderer;
internal TitleWebViewClient(TitleWebViewRenderer titleWebViewRenderer)
{
this.titleWebViewRenderer = titleWebViewRenderer;
}
public override void OnPageFinished(Android.Webkit.WebView view, string url)
{
base.OnPageFinished(view, url);
((IElementController) titleWebViewRenderer.Element).SetValueFromRenderer(TitleWebView.PageTitleProperty, view.Title);
}
}
iOS 渲染器:
public class TitleWebViewRenderer : WebViewRenderer
{
public TitleWebViewRenderer()
{
this.LoadFinished += (object sender, EventArgs e) => {
var titleWebView = (TitleWebView)Element;
((IElementController)Element).SetValueFromRenderer(TitleWebView.PageTitleProperty,
EvaluateJavascript("document.title"));
};
}
}
【讨论】:
titleWebView.PageTitle 将删除任何Binding。相反,请((IElementController) Element).SetValueFromRenderer (TitleWebView.TitleSourceProperty, title);
Daniel Luberda 为 Xamarin 4.2 修复的 TitleWebView 类解决方案:
public class TitleWebView : WebView
{
public static readonly BindableProperty PageTitleProperty = BindableProperty.Create(
propertyName: "PageTitle",
defaultValue: string.Empty,
returnType: typeof(string),
declaringType: typeof(string),
defaultBindingMode: BindingMode.OneWayToSource);
public string PageTitle
{
get => (string) GetValue(PageTitleProperty);
set => SetValue(PageTitleProperty, value);
}
}
【讨论】: