web-dev-qa-db-fra.com

Créer un lien hypertexte à l'aide de Xamarin.Forms (xaml et c #)

Je suis un programmeur professionnel relativement inexpérimenté (je n'ai que 20 ans). Par conséquent, je m'excuse à l'avance car il peut y avoir des concepts plus vastes que je ne saisis pas encore complètement. J'espère que c'est une question appropriée à poser, car une heure de recherche sur Google n'a pas pu m'aider.

Je veux essentiellement créer un lien hypertexte dans Xamarin.Forms en utilisant la classe label. Fondamentalement, je veux suivre le lien pour amener l'utilisateur à google.com dans un navigateur Web:

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

Je ne trouve rien dans l'API Xamarin Forms à ce sujet et Internet a des informations vagues et limitées sur ce sujet dans Xamarin.Forms.

Est-ce possible? Dans l'affirmative, quelqu'un pourrait-il m'orienter dans la bonne direction? Merci d'avance à tous ceux qui répondent.

18
jnel899

Vous ne pouvez pas vraiment faire cela car les étiquettes par défaut ne répondent pas aux entrées de l'utilisateur, mais vous pouvez réaliser quelque chose de similaire avec des gestes

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

var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += (s, e) => {
    Device.OpenUri( new Uri((Label)s).Text);
};
label.GestureRecognizers.Add(tapGestureRecognizer);
20
Jason

J'ai fait ce petit cours pour le gérer:

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)) });
    }
}

Et un peu plus impliqué si vous voulez le souligner aussi:

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; } }
}

La dernière classe inspirée de ce post: comment souligner dans les formes xamarin


Edit: XLabs ont aussi HyperLinkLabel .

10
noelicus

utiliser un bouton et un nuget xamarin.forms.theme

<Button StyleClass = "Link"/>

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

5
Ahmed.Net

Si vous voulez le faire dans Xaml, vous pouvez créer une étiquette avec une couleur de texte bleue et un GestureRecognizers pour le connecter à une commande:

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

Dans votre ViewModel, vous pouvez lancer le navigateur par défaut à l'aide du package 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);
    }

});
1
Donal