web-dev-qa-db-fra.com

Comment créer dynamiquement un événement click sur une étiquette dans les formulaires xamarin

Je travaille sur une application multiplateforme xamarin et je souhaite créer un libellé d'hyperlien pour "Mot de passe oublié?" sur la page de connexion . J'ai utilisé le code suivant pour créer une étiquette mais je ne sais pas comment créer un événement onclick dessus.

 MainPage = new ContentPage
            {
                BackgroundImage = "background.png",
                Content = new StackLayout
                {
                    VerticalOptions = LayoutOptions.CenterAndExpand,
                    HorizontalOptions = LayoutOptions.CenterAndExpand,
                    Spacing = 50,
                    Children = {

                        new Label {
                            HorizontalTextAlignment = TextAlignment.Center,
                            Text = "Welcome, Please Sign in!",
                            FontSize=50,
                            TextColor=Color.Gray,
                        },


                         new Entry
                        {
                             Placeholder="Username",
                            VerticalOptions = LayoutOptions.Center,
                            Keyboard = Keyboard.Text,
                            HorizontalOptions = LayoutOptions.Center,
                             WidthRequest = 350,
                             HeightRequest = 50,
                             FontSize=20,
                             TextColor=Color.Gray,
                             PlaceholderColor=Color.Gray,
                        },

                          new Entry
                        {
                             Placeholder="Password",
                            VerticalOptions = LayoutOptions.Center,

                            Keyboard = Keyboard.Text,
                            HorizontalOptions = LayoutOptions.Center,
                             WidthRequest = 350,
                             HeightRequest = 50,
                             FontSize=25,
                             TextColor=Color.Gray,
                             IsPassword=true,
                              PlaceholderColor =Color.Gray,
                        },
                        new Button
                        {
                            Text="Login",
                            FontSize=Device.GetNamedSize(NamedSize.Large,typeof(Button)),
                            HorizontalOptions=LayoutOptions.Center,
                            VerticalOptions=LayoutOptions.Fill,
                            WidthRequest=350,
                            TextColor=Color.Silver,
                            BackgroundColor=Color.Red,
                            BorderColor=Color.Red,
                        },
                       new Label //for this label I want to create click event to open new page
                        {
                            Text="Forgot Password?",
                            FontSize=20,
                            TextColor=Color.Blue,
                            HorizontalOptions=LayoutOptions.Center,

                        },
                    } 
        }
            };
9
Dipak

Essaye ça :

        var forgetPasswordLabel = new Label   // Your Forget Password Label
        {
            Text = "Forgot Password?",
            FontSize = 20,
            TextColor = Color.Blue,
            HorizontalOptions = LayoutOptions.Center,
        };


        // Your label tap event
        var forgetPassword_tap = new TapGestureRecognizer();   
        forgetPassword_tap.Tapped += (s,e) =>
        {
            //
            //  Do your work here.
            //
        };
        forgetPasswordLabel.GestureRecognizers.Add(forgetPassword_tap);

Échantillon :

        var forgetPasswordLabel = new Label   // Your Forget Password Label
        {
            Text = "Forgot Password?",
            FontSize = 20,
            TextColor = Color.Blue,
            HorizontalOptions = LayoutOptions.Center,
        };

        MainPage = new ContentPage
        {
            BackgroundImage = "background.png",
            Content = new StackLayout
            {
                VerticalOptions = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.CenterAndExpand,
                Spacing = 50,
                Children = {

                    new Label {
                        //HorizontalTextAlignment = TextAlignment.Center,
                        Text = "Welcome, Please Sign in!",
                        FontSize=50,
                        TextColor=Color.Gray,
                    },


                    new Entry
                    {
                        Placeholder="Username",
                        VerticalOptions = LayoutOptions.Center,
                        Keyboard = Keyboard.Text,
                        HorizontalOptions = LayoutOptions.Center,
                        WidthRequest = 350,
                        HeightRequest = 50,
                        FontSize=20,
                        TextColor=Color.Gray,
                        PlaceholderColor=Color.Gray,
                    },

                    new Entry
                    {
                        Placeholder="Password",
                        VerticalOptions = LayoutOptions.Center,

                        Keyboard = Keyboard.Text,
                        HorizontalOptions = LayoutOptions.Center,
                        WidthRequest = 350,
                        HeightRequest = 50,
                        FontSize=25,
                        TextColor=Color.Gray,
                        IsPassword=true,
                        PlaceholderColor =Color.Gray,
                    },
                    new Button
                    {
                        Text="Login",
                        FontSize=Device.GetNamedSize(NamedSize.Large,typeof(Button)),
                        HorizontalOptions=LayoutOptions.Center,
                        VerticalOptions=LayoutOptions.Fill,
                        WidthRequest=350,
                        TextColor=Color.Silver,
                        BackgroundColor=Color.Red,
                        BorderColor=Color.Red,
                    },
                    forgetPasswordLabel
                }
            }
        };

        var forgetPassword_tap = new TapGestureRecognizer();
        forgetPassword_tap.Tapped += (s,e) =>
        {
            //
            //  Do your work here.
            //
        };
        forgetPasswordLabel.GestureRecognizers.Add(forgetPassword_tap);
16
Vaikesh

Pour ceux qui préfèrent utiliser XAML et qui aiment lier Command directement au ViewModel, vous pouvez utiliser ceci:

<Label HorizontalOptions="Center"
       TextColor="Blue"
       FontSize="20"
       Text="Forgot Password?">
    <Label.GestureRecognizers>
        <TapGestureRecognizer Command="{Binding ForgotPasswordCommand}" />
    </Label.GestureRecognizers>
</Label>
10
Mik
MyClickyLabel.GestureRecognizers.Add(
    new TapGestureRecognizer() { 
        Command = new Command(() => { 
            /* Handle the click here */
        } )
    }
);
3
noelicus

Si plusieurs emplacements comportent une étiquette cliquable, il est judicieux de créer un contrôle héritant de Xamarin.Forms Label et de ne pas placer TapGestureRecognizer partout où l'étiquette est requise.

public class ExtendedLabel : Label
{
    private event EventHandler click;

    public string Name
    {
        get; set;
    }

    public void DoClick()
    {
        click.Invoke(this, null);

    }

    public event EventHandler Clicked
    {
        add
        {
            lock (this)
            {
                click += value;

                var g = new TapGestureRecognizer();

                g.Tapped += (s, e) => click?.Invoke(s, e);

                GestureRecognizers.Add(g);
            }
        }
        remove
        {
            lock (this)
            {
                click -= value;

                GestureRecognizers.Clear();
            }
        }
    }
}    

Dans votre fichier XAML, vous importez l'espace de noms dans lequel le contrôle est défini, par exemple.

<ContentPage xmlns:ctrl="clr-namespace:UICore.Controls" ...

Et utilisez-le comme contrôle ordinaire:

<ctrl:ExtendedLabel x:Name="quitButton" Clicked="OnQuit">

https://github.com/maxim-saplin/CrossPlatformDiskTest/blob/master/Saplin.CPDT.UICore/Controls/ExtendedLabel.cs

0
Maxim Saplin