热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Xamarin表单动态创建的Webview不会触发事件

我正在尝试通过动态创建WebView并加载源URL来自动提取一个网站数据。我希望不向

我正在尝试通过动态创建WebView并加载源URL来自动提取一个网站数据。我希望不向用户显示PageWebView。不幸的是,这些事件似乎不起作用。任何帮助表示赞赏。

创建ContentPage并在设计时添加XAML很好。

修改1:
感谢Paul为我提供详细的事件模型方面的帮助。
不幸的是,我的要求是不向用户显示页面和Web视图。如果未将其添加到可视树中,则似乎不会触发webview事件:-(。

也许我应该对我要实现的目标进行更多解释。从“ xamarin表单” /“ xamarin android”平台应用程序/服务中自动进行网站爬网的最佳方法是什么?(我在这里添加了服务,因为我想在后台自动进行此操作)我开始使用webview探索因为它使用本机浏览器并具有相当好的Javascript支持,甚至允许动态Javascript注入。有没有其他选择,例如无头浏览器,它可以实现相同功能,包括Javascript注入?我仍然更喜欢webview,因为它具有灵活性,希望我们可以使其以某种方式工作。

这就是我想要做的:

ContentPage cp = new ContentPage();
cp.Title = "My Page";
StackLayout sl = new StackLayout();
var webView = new WebView();
sl.Children.Add(webView);
cp.COntent= sl;
webView.Navigating += WebView_Navigating;
webView.Navigated += WebView_Navigated;
webView.Source = "https://www.google.com/";//just a sample i tried multiple urls including http
private async void WebView_Navigating(object sender,WebNavigatingEventArgs e)
{
//event not firing!
}
private async void WebView_Navigated(object sender,WebNavigatedEventArgs e)
{
//event not firing!
}


我不知道您将要做什么,但是如果您希望不显示Web视图,则可以使用 isVisible 属性。

您可以在一个显示页面中动态创建Webview。

例如,这是一个显示页面:

public partial class HyWeb : ContentPage
{
public HyWeb()
{
InitializeComponent();
}
private void Button_Clicked(object sender,EventArgs e)
{
WebView webView = new WebView();
webView.WidthRequest = 500;
webView.HeightRequest = 500;
webView.IsVisible = false;
webView.Source = "https://www.google.com";
webView.Navigated += WebView_Navigated;
webView.Navigating += WebView_Navigating;
Stl.Children.Add(webView);
}
private void WebView_Navigated(object sender,WebNavigatedEventArgs e)
{
Console.WriteLine("navigated");
}
private void WebView_Navigating(object sender,WebNavigatingEventArgs e)
{
Console.WriteLine("navigating");
}
}

第xaml页:


xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:local="clr-namespace:App18"
x:Class="App18.HyWeb">






当我单击按钮时,它将动态创建Web视图,但是Web视图将不会显示给用户

,

从实际的角度来看,朱宝o(Leo Zhu)写的是正确的,但让我详细介绍一下。

创建WebView的方式不会将其添加到应用程序的可视树中,因为页面已创建但从未显示过。

我创建了一个小示例,您可以在附件中找到该示例,在其中创建了一个页面,该页面包含一个向该页面添加WebView的按钮。无论如何,单击按钮时不会创建此WebView,而是在页面的构造函数中创建。 Navigated事件调用一种方法,该方法会在事件发生时进行记录。

此外,我创建了一个自定义渲染器,以记录WebView的渲染器以及创建本机控件的时间。

我的调试消息按以下顺序发生

[0:] WebView created
[0:] Button clicked
[0:] Creating renderer
[0:] Creating native control
[0:] WebView navigated

这样,您可以看到-在构造函数中创建Xamarin.Forms视图时-实例化了本地渲染器(负责创建本地视图,而后者又负责加载网站)之后单击按钮(即,在将视图添加到应用程序的可视树之后)。然后,渲染器创建用于加载网站的本机控件。最后,在加载网站之后,将引发Navigated事件。如果将WebView添加到页面并在按下按钮后显示此页面,则基本上相同。

附件(代码)

XAML:


xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="SOTest20191112.MainPage">





后面的代码:

namespace SOTest20191112
{
using System;
using System.ComponentModel;
using System.Diagnostics;
using Xamarin.Forms;
// Learn more about making custom code visible in the Xamarin.Forms previewer
// by visiting https://aka.ms/xamarinforms-previewer
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
private WebView _webView;
public MainPage()
{
InitializeComponent();
this._webView = new WebView
{
Source = new UrlWebViewSource()
{
Url = "http://www.google.de"
}
};
_webView.Navigated += WebViewOnNavigated;
Debug.WriteLine("WebView created");
}
private void WebViewOnNavigated(object sender,WebNavigatedEventArgs e)
{
Debug.WriteLine("WebView navigated");
}
private void Button_OnClicked(object sender,EventArgs e)
{
Debug.WriteLine("Button clicked");
if (!this.StackLayout.Children.Contains(this._webView))
{
this.StackLayout.Children.Add(this._webView);
}
}
}
}

自定义渲染器

using SOTest20191112.Droid;
using Xamarin.Forms;
[assembly: ExportRenderer(typeof(WebView),typeof(WebViewRenderer))]
namespace SOTest20191112.Droid
{
using Android.Content;
using Android.Webkit;
class WebViewRenderer : Xamarin.Forms.Platform.Android.WebViewRenderer
{
public WebViewRenderer(Context context)
: base(context)
{
System.Diagnostics.Debug.WriteLine("Creating renderer");
}
protected override WebView CreateNativeControl()
{
System.Diagnostics.Debug.WriteLine("Creating native control");
return base.CreateNativeControl();
}
}
}

推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
  • 本文介绍了一个Magento模块,其主要功能是实现前台用户利用表单给管理员发送邮件。通过阅读该模块的代码,可以了解到一些有关Magento的细节,例如如何获取系统标签id、如何使用Magento默认的提示信息以及如何使用smtp服务等。文章还提到了安装SMTP Pro插件的方法,并给出了前台页面的代码示例。 ... [详细]
  • SmartRefreshLayout自定义头部刷新和底部加载
    1.添加依赖implementation‘com.scwang.smartrefresh:SmartRefreshLayout:1.0.3’implementation‘com.s ... [详细]
author-avatar
遇见你_天意_384
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有