如何动态地在xamarin表单中创建标签上的click事件

时间:2016-03-05 06:47:23

标签: c# xamarin xamarin.forms cross-platform

我正在开发跨平台xamarin应用程序,我想为“忘记密码?”创建超链接标签。在登录页面上。 我使用以下代码创建标签,但我不知道如何在其上创建onclick事件。

public boolean getPerson(String personId){
    SQLiteDatabase sqldb = getWritableDatabase();
    Cursor c=     sqldb.execSQL("SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_NAME + " = '" + personId+"'");
    if(c!=null){
        return true;
    }
    return false;
}

4 个答案:

答案 0 :(得分:18)

试试这个:

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

示例:

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

答案 1 :(得分:16)

对于喜欢使用XAML并希望将Command直接绑定到ViewModel的用户,您可以使用:

<Label HorizontalOptions="Center"
       TextColor="Blue"
       FontSize="20"
       Text="Forgot Password?">
    <Label.GestureRecognizers>
        <TapGestureRecognizer Command="{Binding ForgotPasswordCommand}" />
    </Label.GestureRecognizers>
</Label>

答案 2 :(得分:3)

MyClickyLabel.GestureRecognizers.Add(
    new TapGestureRecognizer() { 
        Command = new Command(() => { 
            /* Handle the click here */
        } )
    }
);

答案 3 :(得分:0)

如果在多个具有可单击标签的位置,则有必要创建一个继承自Xamarin.Forms标签的控件,并且不要将TapGestureRecognizer放置在需要标签的地方。

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

在XAML文件中,导入定义控件的名称空间,例如

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

并将其用作普通控件:

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

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