You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms(C#):点击WebView超链接获取URL到TextView且不跳转

实现Xamarin.Forms WebView拦截链接并显示URL的方案

没问题,这个需求在Xamarin.Forms里很好实现,核心是利用WebView的Navigating事件拦截跳转行为,同时提取点击的URL显示到文本控件中(注:Xamarin.Forms里对应的控件是Label,你提到的TextView是Android原生控件,在Forms里我们统一用Label即可)。下面是完整的实现步骤和代码示例:

1. 布局部分(XAML)

先在页面里定义WebView和用于显示URL的Label,布局可以根据你的需求调整:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="YourAppNamespace.YourPage">
    <StackLayout Padding="10">
        <!-- 显示URL的Label -->
        <Label x:Name="UrlDisplayLabel" 
               Placeholder="点击链接后URL会显示在这里"
               Margin="0,0,0,10"
               FontSize="Medium"/>
        <!-- 用于加载HTML的WebView -->
        <WebView x:Name="CustomWebView"
                 HeightRequest="400"
                 Navigating="CustomWebView_Navigating"/>
    </StackLayout>
</ContentPage>

2. 后台代码实现(C#)

步骤1:用WebClient下载HTML并加载到WebView

我们用异步方式下载HTML字节数组,避免阻塞UI线程,然后将字节数组转成字符串加载到WebView的HtmlWebViewSource中:

using System.Net;
using Xamarin.Forms;

namespace YourAppNamespace
{
    public partial class YourPage : ContentPage
    {
        public YourPage()
        {
            InitializeComponent();
            // 页面加载时下载并加载HTML
            LoadHtmlFromWeb();
        }

        private async void LoadHtmlFromWeb()
        {
            try
            {
                using (var webClient = new WebClient())
                {
                    // 替换成你要下载的HTML地址
                    string htmlUrl = "https://example.com/your-page.html";
                    // 下载HTML字节数组
                    byte[] htmlBytes = await webClient.DownloadDataTaskAsync(htmlUrl);
                    // 将字节数组转成字符串(注意编码,根据实际情况调整,比如UTF8)
                    string htmlContent = System.Text.Encoding.UTF8.GetString(htmlBytes);
                    // 加载到WebView
                    CustomWebView.Source = new HtmlWebViewSource
                    {
                        Html = htmlContent
                    };
                }
            }
            catch (System.Exception ex)
            {
                // 处理异常,比如显示错误提示
                UrlDisplayLabel.Text = $"加载失败: {ex.Message}";
            }
        }

步骤2:拦截WebView的导航事件,提取URL并取消跳转

在Navigating事件中,我们可以获取到即将跳转的URL,把它赋值给Label,然后取消默认的导航行为,这样WebView就会保持当前页面:

private void CustomWebView_Navigating(object sender, WebNavigatingEventArgs e)
        {
            // 确保是有效链接
            if (!string.IsNullOrEmpty(e.Url))
            {
                // 将URL显示到Label中
                UrlDisplayLabel.Text = $"点击的链接: {e.Url}";
                // 取消默认导航,WebView保持当前页面
                e.Cancel = true;
            }
        }
    }
}

关键说明

  • Navigating事件是在WebView即将导航到新页面时触发的,这是拦截跳转的最佳时机,设置e.Cancel = true就能阻止页面跳转。
  • 如果需要区分内部锚点跳转和外部链接,可以对e.Url做进一步判断,比如检查是否包含当前HTML的基础路径,只拦截外部链接。
  • WebClient的异步方法一定要用await,避免UI线程阻塞导致界面卡顿。

内容的提问来源于stack exchange,提问作者張永霖

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:30:02