Xamarin Forms WebView 检测网站地址更改

4
我有以下的代码,可以在我的Xamarin.Forms跨平台应用程序中设置一个WebView:
ReportsListWebView = new WebView()
{
    VerticalOptions = LayoutOptions.FillAndExpand,
    HorizontalOptions = LayoutOptions.FillAndExpand,
    BackgroundColor = Xamarin.Forms.Color.Transparent
};            

URLReportsListWebView = new  UrlWebViewSource
{
    Url = "http://192.168.0.96/MyWebsite/App/MiniMyWebsite?ActionType=Listing&Params=Reports"
};

ReportsListWebView.Source = URLReportsListWebView;

grid.Children.Add(ReportsListWebView, 0, 4, 0, 1);

情况是我在WebView中引用的网站内有一个列表。当用户在网页上选择列表中的项目时,它会使用JavaScript更改网站的URL(将#SelectedItem=1附加到URL)。我只想能够从应用程序内部识别此更改。

我已经检查了URLReportsListWebView.Url,但它似乎没有更新最新的更改。有什么好的方法可以实现这一点吗?

谢谢

3个回答

2
这实际上是 xamarin forms webview 控件的一个限制。解决方法是创建一个自定义渲染器,Xamarin 支持团队提供了一个很棒的示例,展示如何在 github.com/jgold6/XFormsWebViewCustomRenderer/tree/master 上完成这个过程。请注意保留 HTML 标签。

我需要WindowsPhone的实现。你做过吗? - AEMLoviji
嗨AEM,是的,完成了。应该在Github存储库中有代码。 - Matt

0

当我对http://www.yahoo.com进行了一些测试后,它似乎可以更新WebView.Source属性,即使有查询字符串属性。

你只是更新了当前网页位置而不是导航到新页面吗?也许这就是为什么它对你不起作用的原因?

如果是这样,在更改后,您将能够监视新导航的网页的.Source属性,因为没有事件处理程序或任何东西可用于连接以在页面已导航到/完全加载时得到通知。

更新1:

尝试以下对我有效的操作。

它应该会产生类似以下的更新:

http://www.yahoo.com

https://fr.yahoo.com/?p=us

https://fr.news.yahoo.com/syrie-jihadistes-exécutent-160-soldats-43-casques-bleus-050134941.html

http://www.tv3g.bouquettv.mobi/wap/landing/landing2.asp?c=LFYAH_TVGREEN_AAAMMM&IDLanding=16972&tag=0&Alea=7.906741E-02&Al=MM201408290946299694

代码:

        StackLayout objStackLayout = new StackLayout()
        {
        };
        //
        WebView objWebView1 = new WebView();            
        objWebView1.HeightRequest = 300;
        objStackLayout.Children.Add(objWebView1);
        //
        UrlWebViewSource objUrlToNavigateTo = new UrlWebViewSource()
        {
            Url = "http://www.yahoo.com"
        };
        objWebView1.Source = objUrlToNavigateTo;
        //
        //
        Button cmdButton1 = new Button();
        cmdButton1.Text = "Show Me Current Url";
        objStackLayout.Children.Add(cmdButton1);
        //
        cmdButton1.Clicked += ((o2, e2) =>
            {
                System.Diagnostics.Debug.WriteLine((objWebView1.Source as UrlWebViewSource).Url);
            });
        //
        //
        this.Content = objStackLayout;

嗨,Pete,是的,我尝试了只是在页面之间导航(不使用href javascript),它仍然不能捕获我的代码中的任何更改。我知道这是一个很大的要求,但你能发给我一个识别到变化的代码示例吗?谢谢。 - Matt
当然,没问题。请查看主贴的更新1。另外,请再确认一下您是否正在使用最新的Xamarin.Forms(稳定版)? - Pete
嗨Pete,抱歉回复晚了。我已经尝试了你的代码片段,但仍然没有看到任何改变。我已经双重检查过我的dll是最新的。这真的让我很困惑。我想知道还有什么可能不同。我的所有控件和代码都是使用Xamarin.Forms在运行时编写的Portable类,并且在android和ios部署中共享。您有没有可能给我一个rar/zip文件的代码/sln,我将检查差异。谢谢 - Matt
如果您从我的个人资料页面向我发送电子邮件,我将重新创建小例子并发送给您。另外,也许值得发送更多关于您正在做的事情的信息,这样我就可以帮助更多,希望如此。一旦解决了问题,我们可以在这里更新,让其他人知道结果是否有任何新的有趣内容。 - Pete
嗨,Pete,我以前一直无法在这方面取得任何胜利,直到向Xamarin提问。他们最终说我需要使用自定义渲染器来实现这一点。他们制作了一个示例:https://github.com/jgold6/XFormsWebViewCustomRenderer/tree/master - Matt
显示剩余4条评论

0

如果您还没有自定义渲染器,您需要参考 Xamarin 文档来学习如何自定义渲染 Xamarin.Forms WebView。

如果您已经有了自定义渲染器,在 CustomRenderer 对象内部,您应该访问 NativeWebview 对象并将 HandleShouldStartLoad 分配给其 ShouldStartLoad 事件处理程序。我的错误是将 HandleShouldStartLoad 分配给渲染器本身的事件处理程序,这是行不通的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接