将焦点设置为Xamarin.Forms中的条目

时间:2015-07-01 18:32:07

标签: c# xamarin focus

这只是一个简化的示例,但我试图对此进行设置,以便在我的应用程序中打开此页面时,首先发生的是键盘弹出,以便用户输入他们对Entry字段的回应。

    var namelabel = new Label { Text = "What is your name?" };
    var nameentry = new Entry { Placeholder = "Type here..." };
    var colorlabel = new Label { Text = "What's your fav color?" };
    var colorentry = new Entry { Placeholder = "Type here..." };
    Content = new StackLayout {
       Spacing = 15,
       Children = { namelabel, nameentry, colorlabel, colorentry }
    };

如何将页面焦点设置为第一个条目?此外,在用户输入他们的第一个条目之后,我如何设置它以便用户可以按下"下一个"键盘上的按钮(或沿着这些线的东西)和应用程序将带他们填写第二个条目?

7 个答案:

答案 0 :(得分:19)

使用Focus方法

nameentry.Focus();

如果您希望在页面显示时设置焦点,则应该在OnAppearing方法中执行此操作

    protected override void OnAppearing ()
    {
        base.OnAppearing ();

        nameentry.Focus();
    }

答案 1 :(得分:2)

Focus() 需要有一个可见的页面和可见的控件来关注。

就我而言,问题是 OnAppearing 必须在页面显示/可见之前退出。对我来说有帮助的是在不同的线程中等待页面可见性,然后在主(UI)线程中设置焦点:

id, clientId, serviceId

答案 2 :(得分:1)

我讨厌微软如何做重点工作(TabIndex)。我总是用自己的解决方案来覆盖这种方法。

public class EntryFocusBehavior : Behavior<Entry>
{
    protected override void OnAttachedTo(Entry bindable)
    {
        base.OnAttachedTo(bindable);
        bindable.Completed += Bindable_Completed;
    }

    protected override void OnDetachingFrom(Entry bindable)
    {
        bindable.Completed -= Bindable_Completed;
        base.OnDetachingFrom(bindable);
    }

    private void Bindable_Completed(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(NextFocusElementName))
            return;

        var parent = ((Entry)sender).Parent;
        while (parent != null)
        {
            var nextFocusElement = parent.FindByName<Entry>(NextFocusElementName);
            if (nextFocusElement != null)
            {
                nextFocusElement.Focus();
                break;
            }
            else
            {
                parent = parent.Parent;
            }
        }
    }

    public string NextFocusElementName { get; set; }
}

然后是XAML: XAML Code

!!!如果我在代码中输入错误,请告诉我。

答案 3 :(得分:0)

仅在OnAppearing()内部,添加以下代码

protected async override void OnAppearing()
{
    await Task.Run(() =>
    {
        Task.Delay(100);
        Device.BeginInvokeOnMainThread(async () =>
        {
            txtName.Focus();
        });
    });
}

注意: txtName 是输入字段的引用名称。

答案 4 :(得分:0)

任何人都可以向我解释为什么这不起作用

    protected override void OnAppearing()
    {
       base.OnAppearing();
       CustomerNameEntry.Focus();       
    }

但是可以(添加异步和Task.Delay(1))

    protected override async void OnAppearing()
    {
         base.OnAppearing();
         await Task.Delay(1);
         CustomerNameEntry.Focus();       
    }

我宁愿不要添加这个混乱的东西,它看起来很笨拙,但这是我能够使其正常工作的唯一方法(我也曾尝试在主线程上调用,无济于事)。

答案 5 :(得分:0)

我知道这是一个旧线程,但这可能对某人有用,就像对我有用。

protected override async void OnAppearing()
{
    base.OnAppearing();
    await Task.Delay(500);
    await Task.Run(() =>
    {
        entryname.Focus();
    });
}

答案 6 :(得分:-1)

只要要关注的元素是最顶层的元素,它就应该起作用。我将其放在OnAppearing方法中。

base.OnAppearing();
Entry entry = this.FindByName<Entry>("NameOfEntryElement");
entry.Focus();

此信息的来源在这里: https://forums.xamarin.com/discussion/100354/entry-focus-not-working-for-android

文章中有关于计时问题的进一步讨论。