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

pri*_*Joe 8 c# focus xamarin

这只是一个简化的示例,但我正在尝试将其设置为当我在应用程序中打开此页面时,首先发生的是键盘弹出,以便用户输入对条目的响应领域.

    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 }
    };
Run Code Online (Sandbox Code Playgroud)

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

Jas*_*son 23

使用该Focus方法

nameentry.Focus();
Run Code Online (Sandbox Code Playgroud)

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

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

        nameentry.Focus();
    }
Run Code Online (Sandbox Code Playgroud)


Cha*_*Y S 11

在 OnAppearing() 中添加以下代码,

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

注意:txtName是您的输入字段的参考名称。

  • 很高兴它在你的情况下起作用。它在我的情况下不起作用。否决票尤其针对 TPL 的非常危险的使用(如上所述)。您是否看到以下几点:没有等待的 Task.Delay... 以及没有等待的 async () => 。当代码确实对其他人有帮助时,他们就会投票。这不适合我。这就是系统。 (7认同)
  • @thomasgalliker 这就是对我有用的解决方案。这就是我发布答案的原因,它可能对其他人有帮助。我不知道你为什么投反对票。 (2认同)

ADM*_*-IT 10

在我的一个项目中,我做了这样的事情。请尝试以下示例:

public class EntryFocusBehavior : Behavior<Entry>
{
    public string NextFocusElementName { get; set; }

    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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后是 XAML: XAML 代码

!!!如果我在代码中犯了错误,请告诉我。