Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将焦点设置为Xamarin.Forms中的条目_C#_Xamarin_Focus - Fatal编程技术网

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

C# 将焦点设置为Xamarin.Forms中的条目,c#,xamarin,focus,C#,Xamarin,Focus,这只是一个简化的示例,但我正在尝试设置它,以便在我的应用程序中打开此页面时,首先出现的是键盘弹出,用户可以输入他们对输入字段的响应 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

这只是一个简化的示例,但我正在尝试设置它,以便在我的应用程序中打开此页面时,首先出现的是键盘弹出,用户可以输入他们对输入字段的响应

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

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

使用
聚焦
方法

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

        nameentry.Focus();
    }
如果您希望在页面显示时设置焦点,您可能应该在
OnAppearing
方法中执行此操作

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

        nameentry.Focus();
    }

只要要关注的元素是最顶层的元素,这就应该有效。我将其放在
OnAppearing
方法中

base.OnAppearing();
Entry entry = this.FindByName<Entry>("NameOfEntryElement");
entry.Focus();
base.OnAppearing();
条目=this.FindByName(“条目名称”);
entry.Focus();
此信息的来源如下:


文章中还进一步讨论了时间安排问题。

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

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;
            }
        }
    }
}
public类EntryFocusBehavior:Behavior
{
公共字符串NextFocusElementName{get;set;}
受保护的覆盖无效数据到(条目可绑定)
{
碱。可粘合的DTO(可粘合);
可绑定。已完成+=可绑定\u已完成;
}
受保护的覆盖无效OnDetachingFrom(条目可绑定)
{
可绑定.已完成-=可绑定\已完成;
基础。从(可装订)开始连接;
}
私有void Bindable_已完成(对象发送方,事件参数e)
{
if(string.IsNullOrEmpty(NextFocusElementName))
返回;
var parent=((条目)sender).parent;
while(父级!=null)
{
var nextFocusElement=parent.FindByName(NextFocusElementName);
if(nextDocumentElement!=null)
{
nextFocusElement.Focus();
打破
}
其他的
{
父=父。父;
}
}
}
}
然后是XAML:

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

在OnAppearing()中添加以下代码

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

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

有人能给我解释一下为什么这不起作用吗

    protected override void OnAppearing()
    {
       base.OnAppearing();
       CustomerNameEntry.Focus();       
    }
但确实如此(添加async和Task.Delay(1))


我不想添加这个杂乱的东西,它看起来有点黑,但这是我唯一能让它工作的方法(我也尝试过在主线程上调用,但没有用)。

我知道这是一个旧线程,但这可能对某人有效,因为它对我有效

protected override async void OnAppearing()
{
    base.OnAppearing();
    await Task.Delay(500);
    await Task.Run(() =>
    {
        entryname.Focus();
    });
}
Focus()需要有一个可见的页面和可见的控件来关注

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


在代码中是否有一个特定的地方我应该调用该方法,这样可能会改变结果?请在OnAppearing()中尝试,以便在创建并呈现所有控件后调用它对不起,这是一个noob讨厌的地方,但是我该怎么做呢?我以前从未与OnAppearing()合作过。这是要在页面上调用的方法吗?我如何使用nameentry.Focus()实现这一点?Focus()方法不适用于我,EditTest对象上唯一适用于我的方法是RequestFocus(),可能是Xamarin库在提出这个问题(2015年)后发生了变化?Xamarin Android上不适用于我(至少)。您还应注意正确使用第三方物流。您的Task.Delay(100)未被等待,因此“开火并忘记”对Task.Delay没有任何意义。而且,开始的时候。。。方法有一个异步操作,但没有人在等待任何东西。@thomasgalliker这是我的解决方案。这就是我发布答案的原因,它可能会对其他人有所帮助。我不知道你为什么投了反对票。在你的情况下,这很好。这对我来说不起作用。否决票尤其针对非常危险的第三方物流使用(如上所述)。你看到要点了吗:任务。没有等待的延迟。。。异步()=>不需要等待。当代码对其他人真的有帮助时,他们会投票支持它。这不是给我的。这就是系统。b请注意某些控件何时被隐藏或禁用。想必,无论使用“导航”执行何种动画,在您尝试进行聚焦(显示)之前,新页面尚未出现。延迟可能会等待UI赶上,然后在这种情况下,动画会完成,所以它可以工作。我认为
任务中的
异步
方法。运行
并等待
任务。延迟
会更好。