使用 Xamarin.Forms(xaml 和 c#)创建超链接

Posted

技术标签:

【中文标题】使用 Xamarin.Forms(xaml 和 c#)创建超链接【英文标题】:Create a hyperlink using Xamarin.Forms (xaml and c#) 【发布时间】:2016-10-02 13:10:56 【问题描述】:

我基本上想使用标签类在 Xamarin.Forms 中创建一个超链接。基本上,我想通过以下链接在网络浏览器中将用户带到 google.com:

<Label Text="http://www.google.com/" />

我在 Xamarin Forms API 中找不到任何关于此的内容,并且 Internet 在 Xamarin.Forms 中有关此主题的信息模糊且有限。

这可能吗?如果是这样,有人可以指出我正确的方向吗?提前感谢任何回答的人。

【问题讨论】:

Xamarin Forms 本身没有链接,只需将 GestureListener 添加到标签并自行启动浏览器即可。 HyperlinkButton in C# XAMARIN.FORMS的可能重复 ***.com/a/59255100/340628 TapGestureRecognizer 也接受一个命令。纯粹基于模板的好解决方案。 【参考方案1】:

您不能真正做到这一点,因为默认情况下标签不会响应用户输入,但您可以通过手势实现类似的功能

using Xamarin.Forms;
using Xamarin.Essentials;

Label label = new Label();
label.Text = "http://www.google.com/";

var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += async (s, e) => 
    // Depreciated - Device.OpenUri( new Uri((Label)s).Text); 
    await Launcher.OpenAsync(new Uri(((Label)s).Text));
;
label.GestureRecognizers.Add(tapGestureRecognizer);

【讨论】:

非常感谢!我需要做一个小的更正:实际上,Device.OpenUri(new Uri(((Label)s).Text)); new Uri(uriString) 构造函数对于将字符串初始化为 Uri 是必需的。谢谢你的改变,它起作用了! 由于 OpenUri 已被弃用,您现在应该写 Launcher.OpenAsync(new Uri((s as Label).Text)); @Adriano 谢谢 - 我已经提交了反映这一点的编辑【参考方案2】:

我做了这个小类来处理它:

public class SimpleLinkLabel : Label

    public SimpleLinkLabel(Uri uri, string labelText = null)
    
        Text = labelText ?? uri.ToString();
        TextColor = Color.Blue;
        GestureRecognizers.Add(new TapGestureRecognizer  Command = new Command(() => Device.OpenUri(uri)) );
    

如果你也想强调它,还需要更多的参与:

public class LinkLabel : StackLayout

    private SimpleLinkLabel label;

    public LinkLabel(Uri uri, string labelText = null, bool underlined = true)
    
        // Remove bottom padding
        Padding = new Thickness(Padding.Left, Padding.Top, Padding.Right, 0);
        VerticalOptions = LayoutOptions.Center;

        Children.Add(label = new SimpleLinkLabel(uri, labelText));

        if (underlined)
            Children.Add(new BoxView  BackgroundColor = Color.Blue, HeightRequest = 1, Margin = new Thickness(0, -8, 0, 0) );
    

    public TextAlignment HorizontalTextAlignment  get  return label.HorizontalTextAlignment;  set  label.HorizontalTextAlignment = value;  

受这篇文章启发的后一课:how to underline in xamarin forms


编辑:XLabs 也有 HyperLinkLabel。

【讨论】:

【参考方案3】:

使用按钮和 xamarin.forms.theme nuget

<Button StyleClass = "Link"/>

https://developer.xamarin.com/guides/xamarin-forms/user-interface/themes/light/

【讨论】:

【参考方案4】:

如果您想使用 MVVM 执行此操作,您可以创建一个带有蓝色文本颜色的标签和一个 GestureRecognizers 以将其连接到命令:

<Label TextColor="Blue" Text="Binding Model.LinkDescription">
    <Label.GestureRecognizers>
        <TapGestureRecognizer Command="Binding ClickCommand" CommandParameter="Binding Model.LinkURL"/>
    </Label.GestureRecognizers>
</Label>

在您的 ViewModel 中,您可以使用 Xamarin Essentials Nuget 包启动默认浏览器:

private Boolean IsValidUri(String uri)

    try
    
        new Uri(uri);
        return true;
    
    catch
    
        return false;
    


public ICommand ClickCommand => new Command<string>(async (url) =>

    try
    
        if (!string.IsNullOrEmpty(url))
        
            if (!url.Trim().StartsWith("http", StringComparison.OrdinalIgnoreCase))
            
                url = "http://" + url;
            
            if (IsValidUri(url))
            
                await Browser.OpenAsync(new Uri(url), BrowserLaunchMode.SystemPreferred);
            
        
    
    catch(Exception ex)
    
        Debug.WriteLine(ex.Message);
    

);

【讨论】:

【参考方案5】:
<Label LineBreakMode="WordWrap">
    <Label.FormattedText>
        <FormattedString>
            <Span Text="Google">
                <Span.GestureRecognizers>
                    <TapGestureRecognizer Tapped="Handle_Tapped" />
                </Span.GestureRecognizers>
            </Span>
        </FormattedString>
    </Label.FormattedText>
</Label>
public async void Handle_Tapped(object sender, EventArgs e)

    await Browser.OpenAsync(new Uri(url), BrowserLaunchMode.SystemPreferred);

【讨论】:

以上是关于使用 Xamarin.Forms(xaml 和 c#)创建超链接的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 Xaml 设计器或智能感知与 Xamarin.Forms 一起使用?

Xamarin.Forms 在 XAML 中使用局部变量

Xamarin Forms 使用 XAML 显示来自嵌入式资源的图像

无法滚动在移动设备上使用 Xamarin.Forms 创建的 xaml 页面

如何在 XAML [Xamarin.Forms] 中使用 String 以外的类型设置自定义属性值

在 Xamarin.Forms 上的 XAML 中将 BindingContext 设置为 ViewModel