Posterior a de nuestra prolongada búsqueda de información resolvimos este dilema que suelen tener ciertos los lectores. Te brindamos la respuesta y deseamos servirte de gran ayuda.
Solución:
Basado en la respuesta de Lutaaya, hice un comportamiento que automatiza esto, determinando y configurando la altura de la fila (Gist).
Conducta:
namespace Xamarin.Forms
using System;
using System.Linq;
public class AutoSizeBehavior : Behavior
ListView _ListView;
ITemplatedItemsView Cells => _ListView;
protected override void OnAttachedTo(ListView bindable)
bindable.ItemAppearing += AppearanceChanged;
bindable.ItemDisappearing += AppearanceChanged;
_ListView = bindable;
protected override void OnDetachingFrom(ListView bindable)
bindable.ItemAppearing -= AppearanceChanged;
bindable.ItemDisappearing -= AppearanceChanged;
_ListView = null;
void AppearanceChanged(object sender, ItemVisibilityEventArgs e) =>
UpdateHeight(e.Item);
void UpdateHeight(object item)
if (_ListView.HasUnevenRows)
double height;
if ((height = _ListView.HeightRequest) ==
(double)VisualElement.HeightRequestProperty.DefaultValue)
height = 0;
height += MeasureRowHeight(item);
SetHeight(height);
else if (_ListView.RowHeight == (int)ListView.RowHeightProperty.DefaultValue)
var height = MeasureRowHeight(item);
_ListView.RowHeight = height;
SetHeight(height);
int MeasureRowHeight(object item)
var template = _ListView.ItemTemplate;
var cell = (Cell)template.CreateContent();
cell.BindingContext = item;
var height = cell.RenderHeight;
var mod = height % 1;
if (mod > 0)
height = height - mod + 1;
return (int)height;
void SetHeight(double height)
//TODO if header or footer is string etc.
if (_ListView.Header is VisualElement header)
height += header.Height;
if (_ListView.Footer is VisualElement footer)
height += footer.Height;
_ListView.HeightRequest = height;
|
Uso:
Ok Suponga que su ListView está poblado con NewsFeeds, usemos un ObservableCollection
para contener nuestros datos para poblar un ListView como se muestra a continuación:
Código XAML:
Código C #
ObservableCollection trends = new ObservableCollection();
Luego, asigna la lista de tendencias a ListView:
newslist.ItemSource = trends;
Luego, hemos creado algo de lógica en ListView y los datos, para que ListView envuelva los datos, a medida que aumentan los datos, ListView también aumenta y viceversa :
int i = trends.Count;
int heightRowList = 90;
i = (i * heightRowList);
newslist.HeightRequest = i;
Por tanto, el código completo es:
ObservableCollection trends = new ObservableCollection();
newslist.ItemSource = trends;
int i = trends.Count;
int heightRowList = 90;
i = (i * heightRowList);
newslist.HeightRequest = i;
Espero eso ayude .
Podría hacer un controlador de eventos que tenga en cuenta el tamaño cambiante de las celdas de ListView. Aquí está:
El marco se puede cambiar por Grid, StackLayout, etc. xaml.cs:
static readonly Dictionary> _listViewHeightDictionary = new Dictionary>();
private void VisualElement_OnSizeChanged(object sender, EventArgs e)
private void ListView_OnSizeChanged(object sender, EventArgs e)
Cuando se muestra Frame (se está aplicando ListView.ItemTemplate), el tamaño del marco cambia. Tomamos su altura real a través del método Measure () y la colocamos en Dictionary, que conoce la ListView actual y mantiene la altura de Frame. Cuando se muestra el último cuadro, sumamos todas las alturas. Si no hay elementos, ListView_OnSizeChanged () establece listView.HeightRequest en 0.
Si tienes alguna sospecha y forma de reaccionar nuestro enunciado eres capaz de dejar una crítica y con mucho placer lo observaremos.