在Xamarin Forms中,当我使用以下代码时:
public SomePage()
{
InitializeComponent();
someEntry.Focus();
}
默认情况下,代码条目并未集中,但是,如果我使用以下代码:
protected override void OnAppearing()
{
base.OnAppearing();
someEntry.Focus();
}
它可以根据需要工作(条目是重点)。这是为什么?在InitializeComponent()
通话后,问题是否仍然存在并且处于完全正常的位置?我的意思是,我确定可以从页面构造函数中更改Text
属性。
答案 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)