首页 > 解决方案 > 如何在超链接文本点击中在应用程序内导航?

问题描述

我有一个绑定到标签的文本,其中包含一个<a>Click here</a>锚标记。文本单击此处显示为超链接。单击超链接时,我想导航到应用程序内的页面。

这个怎么做?

我尝试实现自定义Label渲染器,但无法完全实现我的目标。

标签: xamarinxamarin.formsxamarin.androidxamarin.ios

解决方案


  1. 我认为您可以使用 aTapGestureRecognizer并通过转换绑定文本来删除锚标记,使用自定义视图可能会简单得多。为链接文本添加一个可绑定属性,为导航命令添加另一个属性。

自定义视图.Xaml

<ContentView.Content>
    <Label x:Name="linkTextLabel"/>
</ContentView.Content>

自定义视图.Xaml.cs

public string TextWithlink
    {
        get { return (string)GetValue(TextWithlinkProperty); }
        set
        {
            SetValue(TextWithlinkProperty, value);
        }
    }

    public static readonly BindableProperty TextWithlinkProperty = BindableProperty.Create("TextWithlink", typeof(string), typeof(LinkText), "", BindingMode.Default, propertyChanged: OnTextLinkChanged);

    public Command NavigationCommand
    {
        get { return (Command)GetValue(NavigationCommandProperty); }
        set
        {
            SetValue(NavigationCommandProperty, value);
        }
    }

    public static readonly BindableProperty NavigationCommandProperty = BindableProperty.Create("NavigationCommand", typeof(Command), typeof(LinkText), null, BindingMode.Default, propertyChanged: OnNavigationCommandChanged);

    private static void OnNavigationCommandChanged(BindableObject bindable, object oldvalue, object newValue)
    {
        (bindable as LinkText).ChangeCommand();
    }

    private static void OnTextLinkChanged(BindableObject bindable, object oldvalue, object newValue)
    {
        (bindable as LinkText).Changetext();
    }

    private void ChangeCommand()
    {
        linkTapGesture = new TapGestureRecognizer();
        linkTapGesture.Command = this.NavigationCommand;
        linkSpan.GestureRecognizers.Clear();
        linkSpan.GestureRecognizers.Add(linkTapGesture);
    }

    private void Changetext()
    {
        FormattedString formattedString = new FormattedString();

        /// String formatting code, change according to your need
        string[] subStrings = this.TextWithlink.Split('<');
        Span textSpan = new Span()
        {
            Text = subStrings[0] + " "
        };

        string linkString = subStrings[1].Split('>')[1];

        linkSpan = new Span()
        {
            Text = linkString,
        };

        ///

        formattedString.Spans.Add(textSpan);
        formattedString.Spans.Add(linkSpan);
        this.linkTextLabel.FormattedText = formattedString;
    }

用法.Xaml

<local:LinkText
            TextWithlink="{Binding TextWithLink}" NavigationCommand="{Binding NavigationCommand}"/>
  1. 但是,如果您希望通过超链接导航应用程序。由于链接重定向由移动操作系统处理,因此请考虑自定义 uri 重定向。这个博客可能会对你有所帮助。

对于 Android,深层链接

对于 iOS,自定义 URI

恕我直言,URI 导航对于应用程序内的导航可能需要更多的工作。


推荐阅读