web-dev-qa-db-fra.com

HyperlinkButton in C # XAMARIN.FORMS

Je veux créer une étiquette avec possibilité de clic, comme dans WIN phone xaml

<HyperlinkButton Content="My Text to click"/>

Existe-t-il une possibilité de le faire dans Xamarin.Forms?

J'ai trouvé ça mais ce n'est pas la même chose:

https://github.com/XLabs/Xamarin-Forms-Labs/wiki/HyperLinkLabel

12
senzacionale

Je suggérerais d'utiliser GestureRecognizers et d'ajouter un Tap Gesture à une étiquette. Ref: ici

var label = new Label()
{
  Text="My Hyperlink"
};
var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += (s, e) => {
    // handle the tap
};
label.GestureRecognizers.Add(tapGestureRecognizer);

GestureRecognizer est une propriété publique de la classe View dont Label hérite. Voir ici

13
user1

Je prendrais une approche beaucoup plus standard et utiliserais une Button. Il suffit de définir l’arrière-plan en fonction de l’arrière-plan de votre application et de supprimer la bordure. Il n'y a alors pas besoin de code TapGestureRecongniser supplémentaire. (Pseudo Code ci-dessous :)

Xaml:

<Button Text="Click Me!" Background= "YourAppBackground" BorderWidth="0" Clicked="OnButtonClicked" />

Code-Derrière:

void OnButtonClicked(object sender, EventArgs args)
{
    //Open your link in here
}
15
KidCode

Le code XAML serait le suivant:

<Label
    Text="My Text to click"
    HorizontalOptions="Center" >

    <Label.GestureRecognizers>
        <TapGestureRecognizer
            Tapped="OnLabelTapped"
            NumberOfTapsRequired="2" />
    </Label.GestureRecognizers>
</Label>

Remarque: Par défaut, NumberOfTapsRequired est 1. 

Ensuite, dans votre fichier .cs, ajoutez la méthode OnLabelTapped

public void OnLabelTapped(object sender, EventArgs args)
{
    // Your code here
    // Example:
    // DisplayAlert("Message", "You clicked on the label", "OK");
}
1
Curiousity

Oui, vous pouvez utiliser Button Clicked ou TapGestureRecognizer. Si vous souhaitez rediriger vers un site, vous pouvez utiliser WebView. Si vous souhaitez accéder directement à votre propre page native: Si vous utilisez NavigationPage, vous pouvez utiliser Navigation.PushAsync (nouvelle page ()); Si vous n’utilisez pas NavigationPage et souhaitez modifier la page principale:. App.Current.MainPage = new MyContentPage ();

0
kishang

Je fais ceci -> crée la classe suivante:

public class ButtonAsLink : Button
{
    public ButtonAsLink()
    {
        this.TextColor = Color.Blue;
        this.BackgroundColor = Color.Transparent;
        this.BorderWidth = 0;
    }
}

Ensuite, partout où vous devez créer un bouton de lien, utilisez ceci:

SendButton = new ButtonAsLink()
        {
            Text = "Send Logs...",
            VerticalOptions = LayoutOptions.Center
        };
0
Helzgate

C'est une classe que j'utilise pour qu'une étiquette agisse comme un lien:

public class SimpleLinkLabel : Label
{
    public SimpleLinkLabel(Uri uri, string labelText = null)
    {
        Text = labelText ?? uri.ToString();
        GestureRecognizers.Add(new TapGestureRecognizer { Command = new Command(() => Device.OpenUri(uri)) });
    }
}

Pour plus d'options, cette réponse à propos de la création d'un lien hypertexte dans Xamarin Forms peut être utile.

0
noelicus

Si vous voulez un bouton élégant (faites-le comme un lien hypertexte - avec soulignement), vous souhaitez implémenter le rendu personnalisé:

Ajoutez ceci à xamarin.project

using Xamarin.Forms;

namespace xamarin.Mobile.Controls
{
    public class HyperlinkButton : Button
    {
        public HyperlinkButton()
        {
        }
    }
}

Et implémentez le rendu au projet IOS:

using System.ComponentModel;
using xamarin.Mobile.IOS;
using Foundation;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[Assembly: ExportRenderer(typeof(xamarin.Mobile.Controls.HyperlinkButton), typeof(HyperlinkButtonRenderer))]
namespace xamarin.Mobile.IOS
{
    public class HyperlinkButtonRenderer : ButtonRenderer
    {
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (Control != null)
            {
                //Set attribute for underlineing information links
                var underlineAttr = new UIStringAttributes { UnderlineStyle = NSUnderlineStyle.Single };
                Control.SetAttributedTitle(new NSAttributedString(Control.CurrentTitle, underlineAttr), UIControlState.Normal);
            }
        }
    }
}

J'ai ajouté le moteur de rendu pour iOS uniquement. Si vous souhaitez prendre en charge d'autres versions, vous devez ajouter des moteurs de rendu à cette plate-forme.

Et utilisez-le à xcml comme ceci:

<ContentPage ...
xmlns:control="clr-namespace:xamarin.Mobile.Controls">

<control:HyperlinkButton Text="Cancel" Clicked="CancelClicked"/>
</ContentPage>
0
pavel