Xamarin.forms-ListView和;键盘

Xamarin.forms-ListView和;键盘,listview,xamarin.forms,xamarin.android,xamarin.ios,keyboard,Listview,Xamarin.forms,Xamarin.android,Xamarin.ios,Keyboard,我正在做一个Xamarin.forms应用程序聊天,我在列表视图中遇到了一些问题。第一个是,当我准备输入一些信息时,键盘与主聊天重叠。第二种情况发生在我隐藏键盘时,listView不会向下滚动。对于这类问题是否有一些常规的解决方案?以下是视频和相应的代码: 我的xaml页面: <StackLayout> <ListView x:Name="MessagesListView"

我正在做一个Xamarin.forms应用程序聊天,我在
列表视图中遇到了一些问题。第一个是,当我准备输入一些信息时,键盘与主聊天重叠。第二种情况发生在我隐藏键盘时,
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");
        }
    }
公共聊天页面(Classes.ClassConversation.ResultadoConversation对话,Classes.ClassUser.Result用户)
{
初始化组件();
GetResult=对话;
connectionStrings.GlobalVar.email=user.rowKey;
GetUser=user;
Xamarin.Forms.Application.Current.On().UseWindowsOfInputModeAdjust(WindowsOfInputModeAdjust.Resize);
_viewModel=新的ViewModels.ConnectionHub(对话,用户);
}
受保护的重写异步void OnAppearing()
{
base.OnAppearing();
GetHistoryOfConversation(GetResult.rowKey,ConnectionsStrings.GlobalVar.Token,GetUser);
BindingContext=\u视图模型;
wait_viewModel.Connect();
}
受保护的重写异步void OnDisappearing()
{
base.OnDisappearing();
wait_viewModel.Disconnect();
}
//Limpa o campo mensagem quando envia mensagem
已单击私有无效按钮(对象发送者,事件参数e)
{
Message.Text=“”;
}
//达奎拉对话历史回顾展(Funço que recebe o historico de mensagens daquela conversa)
async void GetHistoryOfConversation(字符串conversationId、字符串标记、Classes.ClassUser.Result用户)
{
尝试
{
Classes.ClasMessage messages=await Servicos.Servicos.GetHistoryOfConversation(会话ID、令牌、用户、GetResult);
_viewModel.Pedidos=新的ObserverAgeCollection(messages.result);
var target=_viewModel.Pedidos[_viewModel.Pedidos.Count-1];
MessagesListView.ScrollTo(目标,ScrollToPosition.End,false);
var result=await Servicos.Servicos.ReadConversation(conversationId,GetResult);
}
捕获(例外)
{
等待显示警报(Languages.AppResources.Notifications、Languages.AppResources.errorOccessed,“Ok”);
}
}
第一个是,当我准备好键入一些消息时 键盘与主聊天区重叠

对于第一个问题,您应该检测键盘的上下移动,并在listView中上下移动

在Android中,您可以使用

并阅读解决方案

第二种情况发生在我隐藏键盘和listView时 不会向下滚动所有页面


在将该消息插入listView的itemSource后,您应该在
环境Edidocommand
中滚动listView。

这可能会对您有所帮助。您必须将ListView滚动到最后一项。谢谢您的回复,但它不起作用。它在显示时起作用,但当我通过viewmodel插入注册时,它不起作用。请尝试旋转Listview并在listhello顶部添加项,我在android上已经使用了“调整大小”。问题是,当键盘打开时,Listview的内容不会显示最后一条消息。要查看此消息,您需要滚动。如果我使用“平移”,上面的问题不会发生,但工具栏会消失,listview滚动条不会显示所有数据。iOS上有什么问题?iOS上工作正常。当键盘打开时,将显示listview中的最后一项。发送消息后,是否将listview滚动到EnviarPedidoCommand中的最后一个元素?您应该使用“调整大小”。SendRequestCommand的问题是该命令位于viewmodel中。然后我无法访问列表滚动条。我正在使用调整大小。你可以在我的代码中看到。
<Application ...
             xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
             android:Application.WindowSoftInputModeAdjust="Resize">
  ...
</Application>