为什么输入的Focus()方法不能在页面构造函数中工作?

时间:2016-07-07 08:24:02

标签: xamarin xamarin.forms

在Xamarin Forms中,当我使用以下代码时:

public SomePage()
{
    InitializeComponent();
    someEntry.Focus();
}

默认情况下,代码条目并未集中,但是,如果我使用以下代码:

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

它可以根据需要工作(条目是重点)。这是为什么?在InitializeComponent()通话后,问题是否仍然存在并且处于完全正常的位置?我的意思是,我确定可以从页面构造函数中更改Text属性。

5 个答案:

答案 0 :(得分:1)

在Xamarin中,每个控件都具有等效的视图渲染器,即本机UI元素,只有在将控件添加到本机元素层次结构时才会创建。在构造函数中,尚未创建用于条目的本机元素。但是,在OnAppering中,创建了条目的相应本机元素,因此它可以获得焦点。

此外,这似乎是一个错误,因为Xamarin在创建本机UI元素时存储状态并应用它。是时候提交错误了!!!

答案 1 :(得分:0)

File.xaml

<Entry x:Name="txtLPN" Placeholder="Scan LPN." Grid.Row="1" Grid.Column="0" FontSize="15" Focused="txtLPN_Focused" />

File.cs >>>>>

private void txtLPN_Focused(object sender, FocusEventArgs e)
{
    txtLPN.CursorPosition = 0;
    if (!string.IsNullOrEmpty(txtLPN.Text))
       txtLPN.SelectionLength = txtLPN.Text.Length;
}
protected async override void OnAppearing()
{
    base.OnAppearing();
    await Task.Delay(600);
    txtLPN.Focus();
}

答案 2 :(得分:0)

我尝试了以上所有方法。我认为是因为我的页面是一个弹出窗口,并且具有一些上述动画均无效的动画。但这对我有用:

BackgroundWorker setFocus = new BackgroundWorker();

在构造函数中

setFocus.DoWork += SetFocus_DoWork;
private void SetFocus_DoWork(object sender, DoWorkEventArgs e)
{
       bool worked = false;
       while (!worked)//will keep trying until it can set focus (when MyEntry is rendered)
       {
           Thread.Sleep(1);
           MainThread.InvokeOnMainThreadAsync(()=> worked = MyEntry.Focus());
       }
}
protected override void OnAppearing()
{
     base.OnAppearing();
     if(!setFocus.IsBusy)
     {
         setFocus.RunWorkerAsync();
     }
}

如果“ worked”从未设置为true,则可能要添加一些要处理的内容,例如尝试几秒钟。

答案 3 :(得分:0)

当我使用 Shell 时,这不再起作用。

nltk.ChartParser

但这确实有效:

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

答案 4 :(得分:-2)

在Xamarin形式下面是android活动或iOS的UIviewController的页面生命周期工作。 someEntry.Focus();将无法在您的构造函数

中工作