【问题标题】:Xamarin.Forms.WebView - get title of displayed page?Xamarin.Forms.WebView - 获取显示页面的标题?
【发布时间】:2015-11-24 21:49:02
【问题描述】:

是否可以获取WebView中显示的网页信息?

【问题讨论】:

    标签: xamarin xamarin.forms webview


    【解决方案1】:

    使用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);
    • 是的,没错。我在没有 IDE 的情况下编写了代码。我会改变它。谢谢!
    • 不错,但导航事件不再起作用..Droid。
    • @NickKovalsky 您是否为您提到的问题找到了任何解决方案?我也面临同样的问题。
    【解决方案2】:

    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);
            }
        }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多