Xamarin android 从 Picker 到 Entry 的焦点更改不会打开键盘
Xamarin android focus change from Picker to Entry does not open Keyboard
我有一堆条目和选择器,我希望焦点自动切换到下一个 Entry/Picker。
我通过在 Entry/Picker 上调用 Focus() 方法来做到这一点。如果我当前的焦点在一个 Entry 上,而我的下一个元素是一个 Entry 或一个 Picker,它会改变焦点并按预期打开 Keyboard/Pickerdialog。如果我当前的焦点在 Picker 上,而下一个元素是 Entry,那么 Entry 会按预期获得焦点,但键盘不会打开。
在 Pickers SelectedIndexChanged 事件中调用 focus() 方法。
我该如何解决?
xaml代码:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="ABM.Ablesegeraet.Views.TourenLadenPage"
Title="Touren laden">
<ContentPage.Content>
<StackLayout>
<Label Grid.Row="0" Grid.Column="0" Margin="30,10,0,0" FontSize="Medium" Text="Mandant:"/>
<Picker x:Name="MandantenPicker" ItemDisplayBinding="{Binding Ort}" Title="Mandant" Grid.Row="0" Grid.Column="1" SelectedIndexChanged="MandantPicker_SelectedIndexChanged"/>
<Entry Grid.Row="1" x:Name="test"/>
</StackLayout>
</ContentPage.Content>
SelectedIndexcChanged:
private void MandantPicker_SelectedIndexChanged(object sender, EventArgs e)
{
test.Focus();
}
在Picker的SelectedIndexChanged方法中Picker没有失去焦点,以后如果设置Entry.Focus会导致显示错误
解决办法是SelectedIndexChanged方法运行后Picker失去焦点,然后设置Entry.Focus才能正确显示。
使用Task开启新线程完成本次操作。
这里是背景代码:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private async void picker_SelectedIndexChanged(object sender, EventArgs e)
{
var a = picker.IsFocused;
string res = (sender as Picker).SelectedItem.ToString();
Task.Run(()=> myTask(res));//Create and start the thread
}
private void myTask(string res)
{
Thread.Sleep(300);
var a = picker.IsFocused;
if (res == "Test1")
{
entry1.Focus();
}
if (res == "Test2")
{
entry2.Focus();
}
}
}
我有一堆条目和选择器,我希望焦点自动切换到下一个 Entry/Picker。 我通过在 Entry/Picker 上调用 Focus() 方法来做到这一点。如果我当前的焦点在一个 Entry 上,而我的下一个元素是一个 Entry 或一个 Picker,它会改变焦点并按预期打开 Keyboard/Pickerdialog。如果我当前的焦点在 Picker 上,而下一个元素是 Entry,那么 Entry 会按预期获得焦点,但键盘不会打开。 在 Pickers SelectedIndexChanged 事件中调用 focus() 方法。 我该如何解决?
xaml代码:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="ABM.Ablesegeraet.Views.TourenLadenPage"
Title="Touren laden">
<ContentPage.Content>
<StackLayout>
<Label Grid.Row="0" Grid.Column="0" Margin="30,10,0,0" FontSize="Medium" Text="Mandant:"/>
<Picker x:Name="MandantenPicker" ItemDisplayBinding="{Binding Ort}" Title="Mandant" Grid.Row="0" Grid.Column="1" SelectedIndexChanged="MandantPicker_SelectedIndexChanged"/>
<Entry Grid.Row="1" x:Name="test"/>
</StackLayout>
</ContentPage.Content>
SelectedIndexcChanged:
private void MandantPicker_SelectedIndexChanged(object sender, EventArgs e)
{
test.Focus();
}
在Picker的SelectedIndexChanged方法中Picker没有失去焦点,以后如果设置Entry.Focus会导致显示错误
解决办法是SelectedIndexChanged方法运行后Picker失去焦点,然后设置Entry.Focus才能正确显示。
使用Task开启新线程完成本次操作。
这里是背景代码:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private async void picker_SelectedIndexChanged(object sender, EventArgs e)
{
var a = picker.IsFocused;
string res = (sender as Picker).SelectedItem.ToString();
Task.Run(()=> myTask(res));//Create and start the thread
}
private void myTask(string res)
{
Thread.Sleep(300);
var a = picker.IsFocused;
if (res == "Test1")
{
entry1.Focus();
}
if (res == "Test2")
{
entry2.Focus();
}
}
}