Xamarin.Forms - просмотр списка и запись в виде прокрутки - PullRequest
3 голосов
/ 19 февраля 2020

У меня есть scrollview с Listview и Entry. По сути, эта страница представляет собой чат.

Проблема заключается в том, что при прокрутке представления моя запись исчезает. Если запись находится за пределами просмотра прокрутки, проблема с прокруткой больше не возникает, но когда запись находится в фокусе, просмотр списка не go до конца.

Моя страница чата XAML:

 <ScrollView x:Name="scroll">
            <Grid RowSpacing="0" ColumnSpacing="0" >
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>


                <ListView 
                        x:Name="MessagesListView" 
                        ItemTemplate="{StaticResource MessageTemplateSelector}" 
                        ItemsSource="{Binding Pedidos}" 
                        HasUnevenRows="True"  SeparatorVisibility="None" Grid.Row="0" 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>
            </Grid>
        </ScrollView>

Мой код чата:

 public partial class ChatPage : ContentPage
{
    readonly ViewModels.ConnectionHub _viewModel;
    public ICommand EnviarPedidoCommand { get; set; }
    Classes.ClassConversation.ResultadoConversation GetResult;
    Classes.ClassUser.Result GetUser;

    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);

        GetHistoryOfConversation(conversation.rowKey, ConnectionsStrings.GlobalVar.Token, user);

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

    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 async  void Button_Clicked(object sender, EventArgs e)
    {
        Message.Text = "";
        var target = _viewModel.Pedidos[_viewModel.Pedidos.Count - 1];
        MessagesListView.ScrollTo(target, ScrollToPosition.End, true);
        await scroll.ScrollToAsync(Message, ScrollToPosition.End, true);

    }

    //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, true);
            await scroll.ScrollToAsync(Message, ScrollToPosition.End, true);


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


    private void Message_Focused(object sender, FocusEventArgs e)
    {
        var target = _viewModel.Pedidos[_viewModel.Pedidos.Count - 1];
        MessagesListView.ScrollTo(target, ScrollToPosition.End, true);
    }
}

}

...