Как управлять событием загрузки клавиатуры в iOS - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть форма в Xamarin с двумя <Entry> (элементами управления входом), один из которых при выполнении Tap открывает модальное окно со списком, а другой - в обычном режиме, все работает хорошо, пока пользователь не откроетсначала вводится обычная клавиатура, а затем вызывается модальный режим, когда это происходит, когда клавиатура поднята, и отображается список, блокирующий представление пользователя следующим образом ...

screenshoot

Я хотел бы изменить это поведение, поэтому я присоединяю код XAML вида

MyView.XAML:

      <Entry             
            Placeholder="Nombre Sustancia Química"
            Margin="15,5,15,5"
            HorizontalOptions="FillAndExpand"
            Text="{Binding NombreSustancia, Mode=TwoWay}"
            IsEnabled="{Binding EntryEnabled}">
        </Entry>


       <Entry    
            x:Name="Make"
            Placeholder="Seleccione Fabricante"
            Margin="15,5,15,5"
            Focused="Entry_Focused"
            HorizontalOptions="FillAndExpand"
            Text="{Binding NombreFabricante, Mode=TwoWay}"
            IsEnabled="{Binding EntryEnabled}">
       </Entry>           

MyView.XAML.CS:

public partial class FiltrosSisquimView : ContentPage
    {
        public ObservableCollection<Fabricante> Fabricantes { get; set; }

        public FiltrosSisquimView ()
        {              
            InitializeComponent();            
        }

        private async void Entry_Focused(object sender, FocusEventArgs e)
        {
            //prevents the keyboard from opening when calling the modal
            Make.Unfocus();          
            var mainViewModel = MainViewModel.GetInstance();
            Fabricantes = mainViewModel.Filtros.Fabricantes;
            mainViewModel.FabricantesModal = new FabricantesModalViewModel(Fabricantes);
            await Application.Current.MainPage.Navigation.PushModalAsync(new FabricantesModalView());
        }      

    }

Я должен сказать, что эта проблема возникает только в iOS, и что Android имеет ожидаемое поведение (при открытии модального режима клавиатура автоматически опускается), как клавиатура может опуститься, когда пользователь уже открыл список?Где я должен контролировать это событие?на модальной странице?в коде позади?Я занимаюсь MVVM как архитектурный образец

любая помощь для меня?

1 Ответ

0 голосов
/ 17 декабря 2018

Кажется, проблема с дизайном iOS. Я использую аналогичный код в Xcode и получаю ту же проблему. Так что вы можете использовать custom renderer и решить ее.

в формах

using System;
using Xamarin.Forms;
namespace app1
{
 public class MyEntry:Entry
 {
    public MyEntry()
    {

    }
 }
}

в xaml

<Entry      
    Placeholder="Nombre Sustancia Química"
    Margin="15,5,15,5"
    HorizontalOptions="FillAndExpand"
       >
</Entry>


<local:MyEntry    
     x:Name="Make"
     Placeholder="Seleccione Fabricante"
     Margin="15,5,15,5" 
     Focused="Entry_Focused"      
     HorizontalOptions="FillAndExpand"
      >
</local:MyEntry>

в проекте iOS

using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

using app1;
using app1.iOS;

using UIKit;
using Foundation;


[assembly: ExportRenderer(typeof(MyEntry), typeof(MyEntryRenderer))]
namespace app1.iOS
{
  public class MyEntryRenderer:EntryRenderer,IUITextFieldDelegate
  {
    public MyEntryRenderer()
    {
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if(Control!=null)
        {
            Control.WeakDelegate = this;                       
        }

    }

    [Export("textFieldShouldBeginEditing:")]
    public bool ShouldBeginEditing(UITextField textField)
    {

        MessagingCenter.Send<Object>(this, "finish");

        return false;
    }

  }
}

Теперь подпишитесь на сообщение в вашем contentPage.

public partial class FiltrosSisquimView : ContentPage
{
    public ObservableCollection<Fabricante> Fabricantes { get; set; }

    public FiltrosSisquimView ()
    {              
        InitializeComponent();    

        MessagingCenter.Subscribe<Object>(this, "finish", (obj) => {
        var mainViewModel = MainViewModel.GetInstance();
        Fabricantes = mainViewModel.Filtros.Fabricantes;
        mainViewModel.FabricantesModal = new FabricantesModalViewModel(Fabricantes);
        await Application.Current.MainPage.Navigation.PushModalAsync(new FabricantesModalView());
        });


    }

    private async void Entry_Focused(object sender, FocusEventArgs e)
    {
        //prevents the keyboard from opening when calling the modal
        Make.Unfocus();          
        var mainViewModel = MainViewModel.GetInstance();
        Fabricantes = mainViewModel.Filtros.Fabricantes;
        mainViewModel.FabricantesModal = new FabricantesModalViewModel(Fabricantes);
        await Application.Current.MainPage.Navigation.PushModalAsync(new FabricantesModalView());
    }      

}
...