Xamarin在本机webview中打开超链接

Xamarin在本机webview中打开超链接,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我正在xamarin.forms中开发一个聊天应用程序。对于我的聊天标签,我使用了一个可以自动检测HTTP Web链接的自定义标签。我跟踪的链接是。它工作得很好,URL高亮显示并在默认浏览器中打开,但我希望能够捕获URL单击事件并打开内部浏览器或webview。当前,超链接单击将打开选择其他浏览器应用程序的建议。我在书中看到了类似的问题。但我不明白解决办法。那么,如何在内部浏览器或webview中打开超链接?感谢您的帮助 超链接检测器标签 public class AwesomeHyperLin

我正在xamarin.forms中开发一个聊天应用程序。对于我的聊天标签,我使用了一个可以自动检测HTTP Web链接的自定义标签。我跟踪的链接是。它工作得很好,URL高亮显示并在默认浏览器中打开,但我希望能够捕获URL单击事件并打开内部浏览器或webview。当前,超链接单击将打开选择其他浏览器应用程序的建议。我在书中看到了类似的问题。但我不明白解决办法。那么,如何在内部浏览器或webview中打开超链接?感谢您的帮助

超链接检测器标签

public class AwesomeHyperLinkLabel : Label
    {

    }
安卓部分

IOS部分

我的XAML


如果要在WebView中打开web。单击标签时,可以打开新的内容页

await Navigation.PushAsync(new WebContentPage(source));
网络内容页 使现代化
嗨,谢谢你的回复。我正在使用自定义标签。那么,如何获取超链接单击事件呢?您可以使用TapSignature。不幸的是,TapGestureRecognitor只能捕获标签整体上的点击,但是在我的特定情况下,我需要更具体地捕获标签内的超文本链接单击。例如,如果收到一条信息说你好,请访问www.google.com或www.bing.com,我需要能够单击其中任何一个,从而使用本机超链接检测器。您可以使用Span。您好,在我的例子中,传入的消息可能包含URL,也可能不包含URL。因此,当前传入消息模板中的标签将显示。那么在这种情况下,如何使用跨度呢?当前URL将自动突出显示并单击。我只需要导航到内部浏览器。我应该执行任何特定于平台的实现吗?
[assembly: ExportRenderer(typeof(AwesomeHyperLinkLabel), typeof(AwesomeHyperLinkLabelRenderer))]
namespace WhateverYourNamespace
{
    public class AwesomeHyperLinkLabelRenderer : ViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<View> e)
        {
            base.OnElementChanged(e);

            var view = (AwesomeHyperLinkLabel)Element;
            if (view == null) return;

            UITextView uilabelleftside = new UITextView(new CGRect(0, 0, view.Width, view.Height));
            uilabelleftside.Text = view.Text;
            uilabelleftside.Font = UIFont.SystemFontOfSize((float)view.FontSize);
            uilabelleftside.Editable = false;

        // Setting the data detector types mask to capture all types of link-able data
            uilabelleftside.DataDetectorTypes = UIDataDetectorType.All;
            uilabelleftside.BackgroundColor = UIColor.Clear;

        // overriding Xamarin Forms Label and replace with our native control
            SetNativeControl(uilabelleftside);
        }
    }
}
<controls:HyperLinkLabel TextColor="White"  Text="www.google.com" HorizontalOptions="Start" />
await Navigation.PushAsync(new WebContentPage(source));
<ContentPage.Content>
   <StackLayout VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
     <WebView Source="{Binding source}" />
   </StackLayout>
</ContentPage.Content>
public HtmlWebViewSource source { get; set; }

public WebContentPage(string Websource)
{
  InitializeComponent();

  source = new HtmlWebViewSource() { BaseUrl=Websource};

  BindingContext = this;
}
        var urlStr = "12122wwwww.google.com";

        int startIndex=0, endIndex=0;

        if(urlStr.Contains("www."))
        {
            startIndex = urlStr.IndexOf("www.");
        }

        if (urlStr.Contains(".com"))
        {
            endIndex = urlStr.IndexOf(".com")+3;
        }

        if(startIndex != 0&& endIndex!=0)
        {
            var formattedString = new FormattedString();

            Span span1 = new Span() { Text = urlStr.Substring(0,startIndex) , TextColor = Color.Black,FontSize=20};
           
            formattedString.Spans.Add(span1);

            Span span2 = new Span() { Text = urlStr.Substring(startIndex, endIndex-startIndex+1), TextColor = Color.Blue, FontSize = 20};
            span2.GestureRecognizers.Add(new TapGestureRecognizer() { NumberOfTapsRequired = 1, Command = new Command(() => { }) } );

            formattedString.Spans.Add(span2);

            Span span3 = new Span() { Text = urlStr.Substring(endIndex, urlStr.Length-1-endIndex), TextColor = Color.Black, FontSize = 20};
            formattedString.Spans.Add(span3);

            label.FormattedText = formattedString;
        }

        else
        {
            label.Text = urlStr;
        }