listview - Xamarin.forms - ListView 和键盘之间的故障行为
问题描述
我正在处理 Xamarin.forms 应用程序聊天,但在listView
. 第一个是当我准备好输入一些信息时,键盘与主聊天重叠。第二个发生在我隐藏键盘并且listView
没有完全向下滚动时。这类问题有一些约定的解决方案吗?这是视频和相应的代码:
我的 xml 页面:
<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");
}
}
解决方案
第一个是当我准备好输入一些信息时,键盘与主聊天重叠。
对于第一个问题,您应该向上/向下检测键盘并向上/向下移动 listView。
在Android中,您可以使用软键盘输入模式
<Application ...
xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
android:Application.WindowSoftInputModeAdjust="Resize">
...
</Application>
在iOS中,您需要编写一个自定义渲染器来检测事件。
第二个发生在我隐藏键盘并且 listView 没有完全向下滚动时。
EnviarPedidoCommand
将该消息插入 listView 的 itemSource 后,您应该滚动listView。
推荐阅读
- postgresql - 有没有办法让唯一索引忽略旧数据?
- sql - Oracle截断父表约束错误
- knuth-morris-pratt - 使用 Knuth Morris 计算每个前缀的出现次数
- opencv - catkin 包库链接到 openCV 库
- css - 从 Blade File 下载 PDF 不显示字母 Ć、Č、Ž
- javascript - 将 EditorJs 文本编辑器 json 转换为 html 元素的最佳方法是什么?
- c++ - 未分配被释放的指针(在将堆栈实现为链表时)
- azure-devops - Azure 构建管道突然开始失败(不支持以下服务的当前版本:GitOdb)
- python - 基于多索引对列值求和
- matrix - 获取从方阵的一个点到有障碍物的另一个点的所有可能路径