Listview Forms-滚动视图中的列表视图和条目

Listview Forms-滚动视图中的列表视图和条目,listview,xamarin.forms,xamarin.android,xamarin.ios,scrollview,Listview,Xamarin.forms,Xamarin.android,Xamarin.ios,Scrollview,我有一个带有列表视图和条目的滚动视图。基本上,这个页面是一个聊天 问题在于当我滚动视图时,我的条目消失了。如果条目在scrollview之外,则滚动问题不再发生,但当条目被聚焦时,listview不会转到末尾 我的聊天页面XAML: <ScrollView x:Name="scroll"> <Grid RowSpacing="0" ColumnSpacing="0" > <Grid.RowDefinition

我有一个带有
列表视图和
条目的
滚动视图
。基本上,这个页面是一个聊天

问题在于当我滚动视图时,我的条目消失了。如果条目在scrollview之外,则滚动问题不再发生,但当条目被聚焦时,listview不会转到末尾

我的聊天页面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);
    }
}

我的聊天代码:

 <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);
    }
}
public部分类聊天页:ContentPage
{
只读ViewModels.ConnectionHub\u viewModel;
公共ICommand EnviarPeddocommand{get;set;}
Classes.CLASSCONVERSION.RESULTADOCONVERSION GetResult;
Classes.ClassUser.Result GetUser;
公共聊天页面(Classes.ClassConversation.ResultadoConversation对话,Classes.ClassUser.Result用户)
{
初始化组件();
GetResult=对话;
connectionStrings.GlobalVar.email=user.rowKey;
GetUser=user;
Xamarin.Forms.Application.Current.On().UseWindowsOfInputModeAdjust(WindowsOfInputModeAdjust.Resize);
GetHistoryOfConversation(conversation.rowKey,connectionStrings.GlobalVar.Token,user);
_viewModel=新的ViewModels.ConnectionHub(对话,用户);
BindingContext=\u视图模型;
}
受保护的重写异步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=“”;
var target=_viewModel.Pedidos[_viewModel.Pedidos.Count-1];
MessagesListView.ScrollTo(目标,ScrollToPosition.End,true);
等待scroll.ScrollToAsync(消息,ScrollToPosition.End,true);
}
//达奎拉对话历史回顾展(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,true);
等待scroll.ScrollToAsync(消息,ScrollToPosition.End,true);
var result=await Servicos.Servicos.ReadConversation(conversationId,GetResult);
}
捕获(例外)
{
等待显示警报(Languages.AppResources.Notifications、Languages.AppResources.errorOccessed,“Ok”);
}
}
专用无效消息聚焦(对象发送方,聚焦目标e)
{
var target=_viewModel.Pedidos[_viewModel.Pedidos.Count-1];
MessagesListView.ScrollTo(目标,ScrollToPosition.End,true);
}
}

}

ListView不应嵌套在ScrollView中。如果需要视图,请使用页眉和页脚。同样,我知道ListView不应嵌套在ScrollView中。问题在于,当listview聚焦时,它不会检测键盘,也不会调整视图。当我的listview没有嵌套在scrollviewListView中时,这个问题就存在了。在ScrollView中嵌套的listview会与焦点冲突,因此,您应该确保此listview是否获得了焦点。