Xamarin.forms - Неисправное поведение между ListView и клавиатурой. - PullRequest
1 голос
/ 27 февраля 2020

Я работаю в чате приложения Xamarin.forms, и у меня есть некоторые проблемы с listView. Во-первых, когда я готов набрать какое-то сообщение, клавиатура перекрывает основной чат. Второе происходит, когда я прячу клавиатуру, а listView не прокручивает все вниз. Есть ли какое-то условное решение проблем такого типа? Вот видео и соответствующий код:

ВИДЕО

Моя страница xaml:

  <StackLayout>


        <ListView 
                    x:Name="MessagesListView" 
                    ItemTemplate="{StaticResource MessageTemplateSelector}" 
                    ItemsSource="{Binding Pedidos}" 
                    HasUnevenRows="True"  SeparatorVisibility="None"  HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" IsEnabled="True" SelectionMode="None" BackgroundColor="{StaticResource BackGroundColor}"/>


        <StackLayout Orientation="Horizontal" BackgroundColor="{StaticResource white}" Grid.Row="1">

            <local1:CustomEntry 
                HorizontalOptions="FillAndExpand"  

                Placeholder="{translator:Translate Mensagem}"  
                Keyboard="Chat"  Margin="8,0,0,0" PlaceholderColor="{StaticResource PlaceHolderText}" TextColor="{StaticResource texto}"  FontSize="14" Text="{Binding Pedido.Message}" x:Name="Message"/>
            <Image Source="send.png" WidthRequest="32" HeightRequest="32" Margin="8,8,8,8" BackgroundColor="Transparent">
                <Image.GestureRecognizers>
                    <TapGestureRecognizer
                           Command="{Binding EnviarPedidoCommand}"
                           Tapped="Button_Clicked"
                            />
                </Image.GestureRecognizers>
            </Image>
        </StackLayout>

</StackLayout>

Внутренняя страница:

 public ChatPage(Classes.ClassConversation.ResultadoConversation conversation, Classes.ClassUser.Result user)
    {
        InitializeComponent();

        GetResult = conversation;
        ConnectionsStrings.GlobalVar.email = user.rowKey;
        GetUser = user;

        Xamarin.Forms.Application.Current.On<Xamarin.Forms.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize);

        _viewModel = new ViewModels.ConnectionHub(conversation, user);

    }

    protected override async void OnAppearing()
    {

        base.OnAppearing();
        GetHistoryOfConversation(GetResult.rowKey, ConnectionsStrings.GlobalVar.Token, GetUser);

        BindingContext = _viewModel;

        await _viewModel.Connect();
    }

    protected override async void OnDisappearing()
    {
        base.OnDisappearing();
        await _viewModel.Disconnect();
    }

    //Limpa o campo mensagem quando envia mensagem
    private void Button_Clicked(object sender, EventArgs e)
    {
        Message.Text = "";     
    }

    //Função que recebe o historico de mensagens daquela conversa
    async void GetHistoryOfConversation(string conversationId, string token, Classes.ClassUser.Result user)
    {
        try
        {
            Classes.ClasMessage messages = await Servicos.Servicos.GetHistoryOfConversation(conversationId, token, user, GetResult);
            _viewModel.Pedidos = new ObservableRangeCollection<Classes.SendMessage>(messages.result);

            var target = _viewModel.Pedidos[_viewModel.Pedidos.Count - 1];
            MessagesListView.ScrollTo(target, ScrollToPosition.End, false);

            var result = await Servicos.Servicos.ReadConversation(conversationId, GetResult);
        }
        catch (Exception)
        {
            await DisplayAlert(Languages.AppResources.Notifications, Languages.AppResources.ErrorOccurred, "Ok");
        }
    }

1 Ответ

1 голос
/ 28 февраля 2020

Во-первых, когда я готов набрать какое-то сообщение, клавиатура перекрывает основной чат.

По первому вопросу вы должны обнаружить, что клавиатура вверх / вниз и перемещайтесь вверх / вниз по списку.

В Android вы можете использовать Режим ввода с мягкой клавиатуры

<Application ...
             xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
             android:Application.WindowSoftInputModeAdjust="Resize">
  ...
</Application>

В iOS, вам нужно написать собственный рендер для обнаружения события.

Вы можете проверить ответы в этой теме и прочитать этого блога для решений.

Второе происходит, когда я скрываю клавиатуру, а listView не прокручивает все вниз.

Вы должны прокрутить listView в EnviarPedidoCommand после того, как вы вставите это сообщение в itemSource объекта listView.

...