在 Shell 个浮出控件中导航时键盘会闪烁

Keyboard flashes when navigating in Shell flyouts

我的 Xamarin.Forms 应用正在使用 Shell flyouts 进行导航。当我在 iOS 上浏览应用程序时,我注意到一个奇怪的行为。复制步骤:

  1. 转到包含 Entry 的页面
  2. Entry
  3. 中输入任何内容
  4. 转到另一页
  5. Return 到您在 Entry
  6. 中输入内容的同一页面

键盘弹出然后消失。我可以看到 Entry 中的光标出现然后消失。我删除了很多代码试图找出问题所在,但我找不到。我的代码:

AppShell.xaml:

<Shell xmlns="http://xamarin.com/schemas/2014/forms" 
   xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
   xmlns:local="clr-namespace:MyApp.Views"
   Title="MyApp"
   x:Name="shellAppShell"
   x:Class="MyApp.AppShell">

<FlyoutItem x:Name="flyoutItemMainPage" Title="Home" Icon="icon_about.png">
    <ShellContent x:Name="shellContentMainPage" Route="MainPage" ContentTemplate="{DataTemplate local:MainPage}" />
</FlyoutItem>

<FlyoutItem x:Name="flyoutItemAPage" Title="A Page" Icon="Pagea.png">
    <ShellContent x:Name="shellContentPageA" Route="PageA" ContentTemplate="{DataTemplate local:PageA}" />
</FlyoutItem>

<!-- More flyouts... -->

</Shell>

PageA.xaml:

<ContentPage  
         xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Name="PageA"
         x:Class="MyApp.Views.PageA">
<ContentPage.Content>
    <StackLayout Orientation="Vertical" >
        <Entry />
        <Button Text="back" Clicked="OnBackClicked"/>
    </StackLayout>
</ContentPage.Content>
</ContentPage>

PageA.xaml.cs

public partial class PageA : ContentPage
{
    public PageA()
    {
        InitializeComponent();
    }

    void OnBackClicked(object sender, EventArgs e)
    {
        Shell.Current.CurrentItem = AppShellGlobal.ShellContentMainPage;
    }
}

经过我的测试,这种情况只出现在iOS。

有一个更简单的解决方案,可以重写ContentPage,在页面加载时结束页面的编辑状态。

首先,在项目的 xxx.iOS 目录中创建 MyPageRenderer class。

内部代码如下:

[assembly: ExportRenderer(typeof(ContentPage), typeof(MyPageRenderer))]
namespace App15.iOS
{
    public class MyPageRenderer : PageRenderer
    {
        public override void ViewDidAppear(bool animated)
        {
            View.EndEditing(true);//Solved the problem with this line of code
            base.ViewDidAppear(animated);
        }   
    }
}

截图如下: