<p>Xamarin.Forms.CollectionView-Spezifikation</p>

Erstellt am 27. Juni 2018  ·  178Kommentare  ·  Quelle: xamarin/Xamarin.Forms

KollektionView

Das aktuelle Design und die Implementierungen von Forms ListView sind sehr komplex und schwierig zu warten, bieten jedoch oft nicht die Flexibilität, die sich Benutzer wünschen. Aufgrund der Komplexität der Implementierungen und der Abwärtskompatibilitätsanforderungen kann es schwierig sein, ListView-Fehler zu finden und zu beheben.

Das Ziel der Bemühungen von CollectionView besteht darin, diese Probleme zu lösen, indem die API vereinfacht und die Fähigkeiten der Listenerstellungssteuerelemente der nativen Plattformen genutzt werden. Zu diesem Zweck:

  • CollectionView entfernt das Konzept von Zellen vollständig. Das Cell-Konzept ist zwar in einigen Fällen praktisch, führt jedoch zu einer großen Komplexität in die nativen Implementierungen von ListView. Alles, was mit Zellen möglich ist, kann mit wiederverwendbaren DataTemplates erreicht werden.

  • CollectionView verkleinert die API-Oberfläche. Einige Eigenschaften und Ereignisse aus ListView sind in CollectionView nicht verfügbar. Einige davon sind innerhalb von DataTemplates leicht austauschbar; andere waren sehr spezifisch für bestimmte Plattformen und gehörten nie wirklich dazu. Eine Liste dieser Änderungen finden Sie unten.

  • CollectionView zielt darauf ab, flexibler zu sein, indem keine Annahmen über das Layout festgelegt werden. Dadurch können wir Layouts unterstützen, nach denen Benutzer schon lange gefragt haben (zB eine HorizontalListView) und die die nativen Implementierungen bereits bereitstellen.

_Hinweis: Nichts in diesem Dokument sollte als Hinweis darauf verstanden werden, dass die aktuelle ListView entfernt oder nicht mehr gepflegt wird. Diese Bemühungen zielen lediglich darauf ab, eine alternative Steuerung bereitzustellen, die den Anforderungen vieler Forms-Benutzer leichter gerecht wird._

_Hinweis: Nichts in dieser Spezifikation ist garantiert endgültig; Alle Funktionen, Implementierungen und Schnittstellen können sich ändern._

Aktueller Fertigstellungsstatus der unten angegebenen Funktionen

Unterstützende APIs

Um den Benutzern eine modernere Liste zur Verfügung zu stellen, werden die Bemühungen von CollectionView einige unterstützende APIs umfassen:

  • FontIconSource - Verwendung skalierbarer Glyphen als Symbole; Die Absicht besteht darin, Glyphen überall dort zu unterstützen, wo Forms derzeit Bilder unterstützt. Dies ist offensichtlich in vielen Teilen von Forms eine wünschenswerte Funktion, aber es ist auch absolut wichtig, kontextbezogene Wischgesten in CollectionView zu unterstützen (siehe die FontIconSource-Spezifikation ).

  • SwipeView - Bietet Unterstützung für das Wischen auf einem Element, um weitere Aktionen auszuführen oder anzuzeigen (siehe

Layout-Spezifikation

In dieser Spezifikation kann der Entwickler angeben, ob Elemente in einer vertikalen Liste, einer horizontalen Liste oder einem Raster angeordnet werden sollen. Die zugrunde liegenden nativen Klassen unterstützen alle diese Layouttypen. (Beachten Sie, dass diese Spezifikation unter iOS die Verwendung von UICollectionView anstelle von UITableView voraussetzt.)

Die an CollectionView übergebenen Spezifikationen werden in jedem Renderer nativen Layouts zugeordnet. Wenn beispielsweise ein Rasterlayout angegeben ist, verwendet der Renderer unter iOS (standardmäßig) ein UICollectionViewFlowLayout. Unter Android ist der Standard GridLayoutManager; auf UWP, GridView.

Forms beteiligt sich nicht am Layout der Elemente im Repeater (außer dem Generieren der Elementansichten selbst); Dieser Teil des Layouts ist vollständig nativ.

Die Auswahl der in jedem Renderer zu verwendenden Layoutmethoden kann vom Benutzer geändert werden; Wenn ein Benutzer lieber StaggeredGridLayoutManager auf Android verwenden möchte, könnte dies durch Ändern der Auswahlmethode und Zurückgeben des gewünschten Layout-Managers erreicht werden.

ListView API-Entfernungen

  • IsPullToRefreshEnabled – dies wird jetzt von RefreshView verarbeitet.
  • IsRefreshing - dies wird jetzt von RefreshView behandelt.
  • RefreshCommand - dies wird jetzt von RefreshView verarbeitet.
  • HasUnevenRows - das ist jetzt ItemSizingStrategy.
  • RowHeight - dies wird nun durch das erste auszulegende Element bestimmt.
  • SeparatorVisibility - CollectionView enthält keine integrierten Separatoren; Benutzer können diese (falls gewünscht) in ihren Vorlagen bereitstellen.
  • SeparatorColor - CollectionView enthält keine integrierten Trennzeichen; Benutzer können diese (falls gewünscht) in ihren Vorlagen bereitstellen.
  • GroupShortName - diese Eigenschaft war vorhanden, um Sprunglisten und semantischen Zoom zu unterstützen; CollectionView Phase 1 unterstützt diese Funktionen nicht.

API

Kontextelement

ContextItem bietet eine Möglichkeit, eine kontextbezogene Interaktion anzugeben, die häufig als Teil eines Kontextmenüs angezeigt wird.

public class ContextItem
{
    public static readonly BindableProperty TextProperty;
    public string Text { get; set; }

    public static readonly BindableProperty CommandProperty;
    public ICommand Command { get; set; }

    public static readonly BindableProperty CommandParameterProperty;
    public object CommandParameter { get; set; }

    public static readonly BindableProperty IsEnabledProperty;
    public bool IsEnabled { get; set; }

    public static readonly BindableProperty IconProperty;
    public ImageSource Icon { get; set; }

    public event EventHandler Invoked;
}

Eigenschaften

| API | Beschreibung |
| ------------- | ------------- |
| Text | Ruft die auf dem Element angezeigte Textbeschreibung ab oder legt diese fest. |
| Befehl | Ruft den Befehl ab, der ausgeführt werden soll, wenn dieses Element aufgerufen wird, oder legt diesen fest. |
| Befehlsparameter | |
| Ist aktiviert | Ruft einen Wert ab, der angibt, ob der Benutzer mit dem Kontextelement interagieren kann, oder legt diesen fest. |
| Symbol | Ruft den grafischen Inhalt des Elements ab oder legt diesen fest. |

Veranstaltungen

| API | Beschreibung |
| ------------- | ------------- |
| Aufgerufen | Tritt auf, wenn eine Benutzerinteraktion angibt, dass der von diesem Element dargestellte Befehl ausgeführt werden soll. |

Kontextmenü

Bietet eine Möglichkeit, eine Reihe von Interaktionen anzugeben, die in einem Kontextmenü angezeigt werden sollen. Ein ContextMenu kann für jedes VisualElement bereitgestellt werden und wird gemäß den nativen Plattformkonventionen aktiviert/angezeigt.

public static class ContextMenu
{
    public static readonly BindableProperty MenuItemsProperty =
            BindableProperty.CreateAttached("MenuItems", typeof(ContextMenuItems), typeof(VisualElement));
}


public class ContextMenuItems : IList<ContextItem>
{
}

RefreshView

Verschiebt nach #5882

Auswahlmodus

Stellt das Auswahlmodusverhalten für eine CollectionView bereit.

public enum SelectionMode 
{
    None,
    Single,
    Multiple
}

SelectionChangedEventArgs

public class SelectionChangedEventArgs : EventArgs
{
    public IReadOnlyList<object> PreviousSelection { get; }
    public IReadOnlyList<object> CurrentSelection { get; }
}

Eigenschaften

| API | Beschreibung |
| ------------- | ------------- |
| ZurückAuswahl | Ruft die Liste der Elemente ab, die ausgewählt wurden, bevor die Auswahl geändert wurde. |
| AktuelleAuswahl | Ruft die Liste der Elemente ab, die nach der Auswahländerung ausgewählt werden. |

IIemsLayout

Marker-Schnittstelle, um anzuzeigen, dass die implementierende Klasse ein Layout angibt, das von CollectionView verwendet wird, um seine Elemente anzuordnen.

public interface IItemsLayout {}

ArtikelLayoutOrientierung

Zählt die möglichen Ausrichtungen für ein ItemsLayout . Wenn Elemente hinzugefügt werden, wird die CollectionView in Ausrichtungsrichtung erweitert.

public enum ItemsLayoutOrientation
{
    Vertical,
    Horizontal
}

ArtikelLayout

Basisklasse für von Formularen bereitgestellte Elementlayouts.

public abstract class ItemsLayout : IItemsLayout
{
    public ItemsLayoutOrientation Orientation { get; }

    protected ItemsLayout(ItemsLayoutOrientation orientation);

    public static readonly BindableProperty SnapPointsAlignmentProperty;
    public SnapPointsAlignment SnapPointsAlignment { get; set; }

    public static readonly BindableProperty SnapPointsTypeProperty;
    public SnapPointsType SnapPointsType { get; set; }  

    public static readonly BindableProperty ItemSpacingProperty;
    public Thickness ItemSpacing {get; set;}
}

Eigenschaften

| API | Beschreibung |
| ------------- | ------------- |
| ArtikelLayoutOrientierung | Gibt die Richtung an, in der die CollectionView erweitert wird, wenn Elemente hinzugefügt werden. |
| SnapPointsType | Gibt das Verhalten von Fangpunkten beim Scrollen der Ansicht an. |
| SnapPointsAusrichtung | Gibt an, wie Fangpunkte an Elementen in der Ansicht ausgerichtet werden. |
| Artikelabstand | Gibt den leeren Raum um jedes Element an. |

ListItemsLayout

public class ListItemsLayout : ItemsLayout
{
    public ListItemsLayout(ItemsLayoutOrientation orientation) : base (orientation);

    public static readonly IItemsLayout VerticalList = new ListItemsLayout(ItemsLayoutOrientation.Vertical); 
    public static readonly IItemsLayout HorizontalList = new ListItemsLayout(ItemsLayoutOrientation.Horizontal); 
}

Statische Mitglieder

| API | Beschreibung |
| ------------- | ------------- |
| Vertikale Liste | Gibt eine einspaltige Liste an, in der die Liste vertikal wächst, wenn neue Elemente hinzugefügt werden. |
| Horizontale Liste | Gibt eine einzeilige Liste an, in der die Liste horizontal wächst, wenn neue Elemente hinzugefügt werden. |

GridItemsLayout

Definiert ein mehrzeiliges oder mehrspaltiges Layout.

public class GridItemsLayout : ItemsLayout
{
    public static readonly BindableProperty SpanProperty;
    public int Span { get; set; }

    public GridItemsLayout([Parameter("Span")] int span, [Parameter("Orientation")] ItemsLayoutOrientation orientation) : base (orientation);
}

SnapPointsAusrichtung

Listet die möglichen Ausrichtungen für Fangpunkte in einem ListItemsLayout .

public enum SnapPointsAlignment
{
    Start,
    Center,
    End
}

Aufzählungswerte

| API | Beschreibung |
| ------------- | ------------- |
| Start | Fangpunkte werden an der Vorderkante von Elementen ausgerichtet. |
| Zentrum | Fangpunkte werden an der Mitte der Elemente ausgerichtet. |
| Ende | Fangpunkte werden an der Hinterkante von Elementen ausgerichtet. |

SnapPointsType

Zählt die möglichen Verhaltensweisen für Fangpunkte in einem ListItemsLayout .

public enum SnapPointsType
{
    None,
    Optional,
    Mandatory,
    OptionalSingle,
    MandatorySingle,
}

Aufzählungswerte

| API | Beschreibung |
| ------------- | ------------- |
| Keine | Beim Scrollen werden Elemente nicht gefangen. |
| Optional | Der Inhalt wird am nächsten Fangpunkt gefangen, an dem das Scrollen entlang der Trägheitsrichtung natürlich anhalten würde, wenn die Fangpunkte ausreichend nahe sind. |
| Pflicht | Der Inhalt wird immer am nächsten Fangpunkt gefangen, an dem das Scrollen entlang der Trägheitsrichtung natürlich stoppt. |
| OptionalEinzel | Gleiches Verhalten wie Optional, aber es wird nur ein Element nach dem anderen gescrollt. |
| ObligatorischSingle | Gleiches Verhalten wie bei Obligatorisch, aber es wird nur ein Element nach dem anderen gescrollt. |

Eigenschaften

| API | Beschreibung |
| ------------- | ------------- |
| Spanne | Gibt die Anzahl der Elemente an, die in der eingeschränkten Richtung angeordnet werden sollen. |

ItemSizingStrategie

Stellt die möglichen Strategien zur Elementmessung bereit, die von CollectionView verwendet werden können.

public enum ItemSizingStrategy
{
    MeasureAllItems,    
    MeasureFirstItem
}

Aufzählungswerte

| API | Beschreibung |
| ------------- | ------------- |
| Alle Elemente messen | Jeder Artikel wird einzeln gemessen. |
| MeasureFirstItem | Nur das erste Element wird gemessen; Es wird davon ausgegangen, dass alle nachfolgenden Elemente die gleiche Größe wie das erste haben. |

ItemsUpdatingScrollMode

Definiert Konstanten, die das Scrollverhalten von Elementen beim Aktualisieren angeben.

public enum ItemsUpdatingScrollMode
{
    KeepItemsInView,
    KeepScrollOffset,
    KeepLastItemInView
}

Aufzählungswerte

| API | Beschreibung |
| ------------- | ------------- |
| KeepItemsInView | Passt den Bildlauf-Versatz an, um das erste sichtbare Element im Ansichtsfenster beizubehalten, wenn Elemente hinzugefügt werden. |
| KeepScrollOffset | Behält den Scroll-Offset relativ zum Anfang der Liste bei, wenn Elemente hinzugefügt werden. |
| KeepLastItemInView | Passt den Scroll-Versatz an, um das letzte sichtbare Element im Ansichtsfenster beizubehalten, wenn Elemente hinzugefügt werden. |

KollektionView

Zeigt eine Liste von Elementen an.

public class CollectionView : View
{
    public static readonly BindableProperty ItemsLayoutProperty;
    public IItemsLayout ItemsLayout { get; set; }

    public static readonly BindableProperty ItemsSourceProperty;
    public IEnumerable ItemsSource { get; set; }

    public static readonly BindableProperty ItemTemplateProperty;
    public DataTemplate ItemTemplate { get; set; }

    public static readonly BindableProperty ItemsUpdatingScrollMode;
    publio ItemsUpdatingScrollMode ItemsUpdatingScrollMode { get; set; }

    public static readonly BindableProperty HeaderProperty;
    public object Header { get; set; }

    public static readonly BindableProperty HeaderTemplateProperty;
    public DataTemplate HeaderTemplate { get; set; }

    public static readonly BindableProperty IsHeaderStickyProperty;
    public bool IsHeaderSticky { get; set; }

    public static readonly BindableProperty FooterProperty;
    public object Footer { get; set; }

    public static readonly BindableProperty FooterTemplateProperty;
    public DataTemplate FooterTemplate { get; set; }

    public static readonly BindableProperty IsFooterStickyProperty;
    public bool IsFooterSticky { get; set; }

    public static readonly BindableProperty EmptyViewProperty;
    public object EmptyView { get; set; }

    public static readonly BindableProperty EmptyViewTemplateProperty;
    public DataTemplate EmptyViewTemplate { get; set; }

    public static readonly BindableProperty GroupDisplayBindingProperty;
    public BindingBase GroupDisplayBinding { get; set; }

    public static readonly BindableProperty GroupHeaderTemplateProperty;
    public DataTemplate GroupHeaderTemplate { get; set; }

    public static readonly BindableProperty GroupFooterTemplateProperty;
    public DataTemplate GroupFooterTemplate { get; set; }

    public static readonly BindableProperty ItemSizingStrategy;
    public bool ItemSizingStrategy { get; set; }

    public static readonly BindableProperty IsGroupingEnabledProperty;
    public bool IsGroupingEnabled { get; set; }

    public static readonly BindableProperty SelectionModeProperty;
    public SelectionMode SelectionMode { get; set; }

    public static readonly BindableProperty SelectedItemProperty;
    public object SelectedItem { get; set; }

    public static readonly BindableProperty SelectedItemsProperty;
    public IList<object> SelectedItems { get; set; }

    public static readonly BindableProperty SelectionChangedCommandProperty;
    public ICommand SelectionChangedCommand;

    public static readonly BindableProperty SelectionChangedCommandParameterProperty;
    public object SelectionChangedCommandParameter;

    public static readonly BindableProperty RemainingItemsThresholdProperty;
    public int RemainingItemsThreshold { get; set; }

    public void ScrollTo(object item, object group = null, 
        ScrollToPosition position = ScrollToPosition.MakeVisible, bool animate = true);

    public void ScrollTo(int index, int groupIndex = -1, 
        ScrollToPosition position = ScrollToPosition.MakeVisible, bool animate = true);

    public event EventHandler<SelectionChangedEventArgs> SelectionChanged;

    public event EventHandler<EventArgs> RemainingItemsThresholdReached; 
}

Eigenschaften

| API | Beschreibung |
| ------------- | ------------- |
| ArtikelLayout | Ruft die Layoutspezifikation für die Liste ab oder legt diese fest. |
| ItemSizingStrategie | Benutzerhinweis, der dem Steuerelement bereitgestellt werden kann, um die Leistung zu verbessern. Wenn dies auf MeasureAllItems (Standard) eingestellt ist, wird jedes Element einzeln gemessen. In Situationen, in denen die Artikelgröße einheitlich sein soll, kann dieser Wert auf MeasureFirstItem ; nur der erste Artikel wird gemessen und alle nachfolgenden Artikel erhalten die gleiche Größe wie der erste. |
| ItemTemplate | Ruft das DataTemplate ab, das zum Anzeigen jedes Elements verwendet wird, oder legt dieses fest.|
| ItemsUpdatingScrollMode | Ruft einen Wert ab, der das Bildlaufverhalten angibt, wenn die Elemente aktualisiert werden, oder legt diesen fest. |
| IsGroupingEnabled | Ruft einen Wert ab, der angibt, ob die zugrunde liegenden Daten in Gruppen angezeigt werden sollen, oder legt diesen fest. |
| Kopfzeile | Ruft die Zeichenfolge, Bindung oder Ansicht ab, die oben im Steuerelement angezeigt wird, oder legt diese fest. |
| HeaderTemplate | Ruft eine Datenvorlage ab, die zum Formatieren des Headers verwendet wird, oder legt diese fest. |
| IsHeaderSticky | Gibt an, ob die Kopfzeile beim Scrollen des Benutzers an Ort und Stelle bleibt. Der Standardwert ist True |
| Fußzeile | Ruft die Zeichenfolge, Bindung oder Ansicht ab, die am unteren Rand des Steuerelements angezeigt wird, oder legt diese fest. |
| Fußzeilenvorlage | Ruft eine Datenvorlage ab, die zum Formatieren der Fußzeile verwendet wird, oder legt diese fest. |
| IsFooterSticky | Gibt an, ob die Fußzeile beim Scrollen des Benutzers an Ort und Stelle bleibt. Der Standardwert ist True |
| Leeransicht | Ruft die Zeichenfolge, Bindung oder Ansicht ab, die angezeigt wird, wenn ItemsSource leer ist, oder legt diese fest. |
| EmptyViewTemplate | Ruft eine Datenvorlage ab, die zum Formatieren der EmptyView verwendet wird, oder legt diese fest. |
| GroupHeaderTemplate | Ruft eine DataTemplate für Gruppenheader ab oder legt diese fest. |
| GroupFooterTemplate | Ruft eine DataTemplate für Gruppenfußzeilen ab oder legt diese fest.* |
| ArtikelQuelle | Die Liste der im Steuerelement anzuzeigenden Objekte. |
| Auswahlmodus | Ruft das Auswahlverhalten für das Steuerelement ab oder legt dieses fest. |
| Ausgewähltes Element | Ruft das ausgewählte Element für SelectionMode von Single oder legt dieses fest. Wenn das ausgewählte Element aus der Elementquelle entfernt wird, wird SelectedItem auf null . |
| Ausgewählte Elemente | Ruft die ausgewählten Elemente für SelectionMode von Multiple oder legt diese fest. Wenn ausgewählte Artikel aus der Artikelquelle entfernt werden, werden sie aus SelectedItems und SelectionChanged erhöht. |
| SelectionChangedCommand | Ruft den ICommand ab, der ausgeführt werden soll, wenn sich die Auswahl ändert, oder legt diesen fest. |
| SelectionChangedCommandParameter | Ruft den Parameter für SelectionChangedCommand ab oder legt diesen fest. |
| GroupDisplayBinding | Ruft die Bindung ab, die zum Anzeigen des Gruppenheaders verwendet werden soll, oder legt diese fest. |
| RemainingItemsThreshold | Gibt den Schwellenwert für noch nicht in der CollectionView sichtbare Elemente an, bei dem das RemainingItemsThresholdReached Ereignis ausgelöst wird. Der Standardwert ist -1, was bedeutet, dass das Ereignis nie ausgelöst wird. Bei einer 0 wird das Ereignis ausgelöst, wenn das letzte Element angezeigt wird, das sich derzeit im ItemsSource befindet. Bei Werten größer als 0 wird das Ereignis ausgelöst, wenn ItemsSource derzeit diese Anzahl von Elementen enthält, zu denen noch nicht gescrollt wurde. |

Methoden

| API | Beschreibung |
| ------------- | ------------- |
| ScrollTo(Objektelement, Objektgruppe = null, ScrollToPosition position = ScrollToPosition.MakeVisible, bool animate = true) | Scrollt das angegebene Element in die Ansicht. |
| ScrollTo(int index, int groupIndex = -1, ScrollToPosition position = ScrollToPosition.MakeVisible, bool animate = true) | Scrollt das Element am angegebenen Index in die Ansicht. |

Veranstaltungen

| API | Beschreibung |
| ------------- | ------------- |
| AuswahlGeändert | Wird ausgelöst, wenn sich die Eigenschaften SelectedItem oder SelectedItems ändern. Dies schließt Änderungen ein, die als Ergebnis der Änderung der Eigenschaft SelectionMode . |
| Verbleibende ElementeThresholdReached | Wird ausgelöst, wenn die CollectionView so weit gescrollt wird, dass nur RemainingItemsThreshold Elemente nicht angezeigt wurden. Dieses Ereignis kann verarbeitet werden, um mehr Elemente zu laden. |

Szenarien

Chat-Anwendung

Der Entwickler hat eine App mit einem Chat-Client. Nachrichten werden unten in der Liste angezeigt und scrollen vom Bildschirm nach oben. Wie kann der Entwickler diese Benutzeroberfläche mit der vorgeschlagenen API erreichen?

Um dieses Verhalten zu erreichen, sollte der Entwickler die Eigenschaft CollectionView.ItemsUpdatingScrollMode auf KeepLastItemInView . Wenn sich die Bildlaufposition des Benutzers am Ende der CollectionView befindet, werden die neuen Elemente unten angezeigt und in die Ansicht gescrollt. Wenn sich die Scroll-Position des Benutzers an einer anderen Stelle befindet, werden die neuen Elemente unten angezeigt, aber die Scroll-Position bleibt unverändert.

Am nächsten ausrichten

Die App des Entwicklers zeigt eine Liste mit Immobilienangeboten an. Wenn der Benutzer durch die Liste scrollt, sollte das Scrollen glatt sein, bis der Benutzer stoppt. Wenn das Scrollen stoppt, sollte die Benutzeroberfläche der App den Scroll (animiert) einrasten lassen, damit die oberste Auflistung perfekt am oberen Rand der Seite ausgerichtet ist. Der Snap sollte immer in der Richtung erfolgen, die die geringste Bewegung erzeugt.

Um dieses Verhalten zu erreichen, sollte der Entwickler ein ListItemLayout mit den folgenden Einstellungen verwenden:

  • Orienation : Vertical
  • SnapPointsAlignment : Start
  • SnapPointsType : Mandatory

Tabellenansicht

Der Entwickler möchte eine Einstellungsseite mit einem TableView-ähnlichen Erscheinungsbild neu erstellen.

Der Entwickler möchte ein ListItemsLayout mit vertikaler Ausrichtung verwenden. Das ItemsTemplate sollte auf ein DataTemplate festgelegt werden, das das Aussehen und Verhalten einer Tabellenzelle nachbildet. Wenn die Benutzeroberfläche "Einstellungen" mehr als einen Einstellungstyp ansprechen soll (z. B. wenn einige Zellen eine Einstellung ein- oder ausschalten und andere zu einem sekundären Einstellungsbildschirm navigieren sollen), möchte der Entwickler möglicherweise Erstellen Sie einen DataTemplateSelector, der ein DataTemplate für Ein/Aus-Einstellungen (mit einem Kippschalter) und ein DataTemplate für die Navigation (mit einer TapGesture, die die sekundäre Einstellungsseite auf den Navigationsstapel schiebt) implementiert.

Unendliche Schriftrolle

Der Entwickler hat eine App, die einen "News"-Feed anzeigt. Der "News"-Feed enthält eine unendliche Anzahl potenzieller Elemente. Wenn sich der Benutzer dem Ende des aktuell geladenen Datensatzes nähert, muss die App einen asynchronen Aufruf an den Server senden, um weitere Daten zu laden. Es ist für die App von entscheidender Bedeutung, dass Daten geladen werden, bevor der Benutzer innerhalb der Grenzen der Netzwerklatenz/Bandbreite entweder Leerzeichen sieht oder daran gehindert wird, zu scrollen. Wie kann der Entwickler dies mit der vorgeschlagenen API erreichen?

Um dies zu erreichen, sollte der Entwickler die Eigenschaft RemainingItemsThreshold und das Ereignis RemainingItemsThresholdReached . Wenn das Ereignis ausgelöst wird, kann der Handler den Server asynchron aufrufen, um mehr Daten in das zugrunde liegende ItemsSource zu laden.

collectionview blocker roadmap enhancement ➕

Hilfreichster Kommentar

Wie wäre es mit einem Scrolling-Ereignis, um Parallax-Header zu unterstützen?

Alle 178 Kommentare

Wie wäre es mit einem Scrolling-Ereignis, um Parallax-Header zu unterstützen?

Daran gibt es viel zu lieben.

FontIconSource

Für die FontIconSource brauchen wir jedoch wirklich eine Möglichkeit, den Unicode-Wert nicht zu verwenden (wenn wir nicht möchten). Wenn Sie sich eine FontIconSource mit dem Wert f370 ansehen, haben Sie keine Ahnung, was das sein soll.

Auf der anderen Seite, wenn ich auswählen kann, welche Icon-Schriftart ich verwende und Forms eine Möglichkeit gebe, fa-app-store-ios in das Unicode-Äquivalent von f370 umzuwandeln, kann ich jetzt auf einen Blick wissen dass das von mir verwendete Symbol von Font Awesome ist und es sich um das iOS App Store-Symbol handelt. Ich sage auf keinen Fall, dass Forms dieses Verständnis für jede verfügbare Schriftart (oder auch jede andere) haben sollte, die entweder aus öffentlichen Gists stammen oder zum Community-Toolkit hinzugefügt werden kann usw. In jedem Fall benötigen wir eine Möglichkeit, sinnvolle Namen zu verwenden.

Zu guter Letzt würde ich hoffen, dass wir dafür eine in XAML gebackene Erweiterung bekommen, damit Sie so etwas haben könnten:

<Image Source="{FontIcon fa-app-store-ios,Color={StaticResource primaryColor}}" />

Menüs

Wie ich vorhin mit anpassen können, um die entsprechenden Ergebnisse zu erzielen. Ein guter Kontext hierfür wäre, sich einen E-Mail-Client vorzustellen, in dem Sie möglicherweise ein Menü erhalten, wenn Sie nach links wischen und ein anderes, wenn Sie nach rechts wischen. Ein weiteres Szenario, das ich gerne unterstützt sehen würde, wäre der Zellenmenü-Ansatz, wie er in den Dokumenten für die iOS CollectionView gezeigt wird .

Veranstaltungen

Ich denke, man kann mit Sicherheit sagen, dass ich voreingenommen bin, aber ein sehr großer Teil der Community folgt einem MVVM-Entwurfsmuster. Die Ereignisse SelectionChanged & RemainingItemsThresholdReached sind beide wichtig für die API, aber es wäre fantastisch, wenn wir einen Weg finden könnten, diese OOB mit einer ViewModel-Version eines Ereignishandlers zu unterstützen ... und Ich befehle.

Da RemainingItemsThresholdReached nur ein einfaches altes EventArgs sendet, können wir davon ausgehen, dass die Übergabe von Null an den Befehl in Ordnung sein sollte, da wir nur den Befehl ausführen müssen. Für SelectionChanged würde ich denken, dass es wichtiger ist, die neuen Elemente als die alten Elemente zu kennen. Daher sollte die einfache Übergabe der neuen Elemente OOB an einen SelectionChangedCommand in Ordnung sein. Dies trifft möglicherweise nicht auf jeden Anwendungsfall, bietet aber zumindest einen minimalen Overhead, den ein Entwickler mit etwas EventToCommandBehavior hinzufügen muss.

Das perfekte Beispiel, das die aktuelle Listenansicht beendet, ist die Kalendersteuerung, bei der:
-days (Zellen) können viele Stile haben:
als Aktionstag, Geburtstag, Behinderte / kein Verkaufstag / Feiertag ...
eingebettete Symbole mit verschiedenen benutzerdefinierten Schriftarten darin, Zelle hat Schatten, wenn ausgewählt, anderer Stil, wenn in r
Wut, andere am Anfang und am Ende des Bereichs
-Auswahl von Datumsräumen ist möglich
-Monatskopfzeile und benutzerdefinierter Kopfzeilenstil
-Monatsüberschriften haben Schaltflächen, die einige spezielle Ansichten/Aktionen/Anzeigen des aktuellen Monats ermöglichen

Wie wäre es, auch ein GroupFooterTemplate hinzuzufügen?

Dies wird in Forms so dringend benötigt :-) CollectionView würde teure Workarounds eliminieren, Einschränkungen lösen und wahrscheinlich die Leistung in fast jeder Forms-App verbessern, die ich in den letzten 5 Jahren erstellt habe. Genau der richtige Ansatz – nutzen Sie die Leistungsfähigkeit der nativen Plattformen und zeigen Sie sie auf.

Gäbe es nur EINE Erweiterung, die ich für Forms anfordern könnte, wäre es diese.
(eigentlich habe ich das 2017 als Antwort auf @davidortinau getan)

Das ist wirklich großartig und wird lange erwartet! Die API ist sauber und unkompliziert (danke für die Umbenennung in HasUnevenRows!).

Scrolling-Ereignisse werden dringend benötigt, wie von @dhaligas vorgeschlagen. Für Parallax-Animationen, aber auch zum Ausblenden von schwebenden Action-Buttons beim Scrollen zum Beispiel.

FontIconSource ist eine gute Idee. Es könnte großartig sein, eine Standardliste von Symbolen bereitzustellen, wobei Unicode für jede Plattform zugeordnet ist (ähnlich wie bei iOS oder UWP).

Das klingt nach genau dem, was benötigt wird. Die API sieht viel sauberer aus, da mehrere Ansichten/Container auf diese Weise strukturiert sind, sollte der Code sauberer und einfacher bleiben.

Meine Kommentare bisher:

@dansiegel Ein Befehl, wenn der Schwellenwert für verbleibende Gegenstände erreicht ist, wäre willkommen. Ich bin mir jedoch nicht sicher, ob es für SelectedItems benötigt wird - alles, was Sie sagen (benachrichtigt über Änderungen, was sich geändert hat und sogar warum), wird automatisch verarbeitet, solange SelectedItems eine ObservableCollection ist (oder alles, was INotifyCollectionChanged implementiert). Ich hätte lieber so wenig Code wie möglich in CollectionView, um die Komplexität gering zu halten.

Scrollen: Ich stimme dem Scrolling-Event voll und ganz zu. Wir können es im Moment für Android bekommen, aber für iOS müssen Sie die UITableViewSource umschließen und die Scrolled-Methode hijacken.

Am wichtigsten wäre für mich die Erweiterbarkeit. Bitte verwenden Sie keine internen Klassen für Adapter und TableViewSources, und stellen Sie bitte in den nativen Renderern die Methoden "CreateAdapter" und "CreateViewSource" (und ähnliches für andere Plattformen) bereit, wo wir unseren eigenen Typ erstellen können, wenn wir möchten. Wir haben einen benutzerdefinierten ListAdapter für Drag-and-Drop-Unterstützung auf Android und, wie bereits erwähnt, eine benutzerdefinierte UITableViewSources für Scrollen und Drag-and-Drop. Es ist jedoch kein Code, den ich mag, weil interne Klassen usw.

Dies gilt nicht nur für Adapter/Viewsources. Im Allgemeinen fügen Sie in der neuen API Punkte hinzu, an denen wir das Verhalten bei Bedarf erweitern können.

Das finde ich ein wirklich tolles und wichtiges Feature!
iOS verwendet bereits den UICollectionView-Namen, was bei der Suche nach CollectionView zu Verwirrung und falschen Google-Ergebnissen führen kann. Ist das ein Problem?

Nur um es vorweg zu nehmen, ich liebe im Grunde alles an CollectionView Spec. Es könnte sich jedoch lohnen, einige der Dinge in separate Themen aufzuteilen, da ich mir darüber Gedanken mache, wie ich sicher viele andere auch habe, und ich sehe, dass es schwierig wird, den Gesprächen zu folgen. Beispielsweise:

Dies könnte später hinzugefügt werden, aber so etwas wie:

public class MultipleFontIconsSource : ImageSource
{
    public List<FontIconSource> Icons { get; set; }
}

wäre nützlich, um das Stapeln von Symbolen zu unterstützen: https://fontawesome.com/how-to-use/on-the-web/styling/stacking-icons

Mein Feedback:

  1. Ich würde die Elementauswahlfunktionen nicht in die CollectionView-Klasse einfügen. Stattdessen würde ich eine abstrakte Basisklasse ListCollectionView hinzufügen, die von CollectionView abgeleitet ist und bestimmte Funktionen hat:
public class CollectionView : View
{
   // Common capabilities related to a view capable of displaying a list of items
    public static readonly BindableProperty ItemsLayoutProperty;
    public IItemsLayout ItemsLayout { get; set; }

    public static readonly BindableProperty ItemsSourceProperty;
    public IEnumerable ItemsSource { get; set; }
}

public class ListCollectionView : CollectionView
{
     // Item selection capabilities and other capabilities 

    public static readonly BindableProperty SelectionModeProperty;
    public SelectionMode SelectionMode { get; set; }

    public static readonly BindableProperty SelectedItemProperty;
    public object SelectedItem { get; set; }

    public static readonly BindableProperty SelectedItemsProperty;
    public IList<object> SelectedItems { get; set; }

    public static readonly BindableProperty SelectedItemsProperty;
    public IList<object> SelectedItems { get; set; }
}

Meine Idee ist, eine CollectionView ähnlich dem ItemsControl in Windows XAML zu haben. Das ItemsControl nimmt eine Panel-Instanz an, die die Elemente positioniert. In Forms haben wir CollectionView und IItemsLayout.
Wenn kein IItemLayout angegeben ist, könnte das Standardlayout standardmäßig ein Stapellayout sein. Auf diese Weise könnten wir im Grunde ItemsSource mit StackPanel von Windows XAML kombinieren, oder mit anderen Worten, ein bindbares StackLayout !

Neben der Elementauswahl gibt es andere Funktionen, die ich nicht in die CollectionView packen würde, ich würde diese der ListCollectionView hinzufügen. Die CollectionView sollte beispielsweise kein Scrollen haben. Auf diese Weise wird dieser Thread abgedeckt

  1. Ich würde die IItemsLayout-Schnittstelle in ICollectionViewLayout umbenennen. Das Framework hat bereits Layout und ItemsView . Es wäre ein längerer Name, aber das ICollectionViewLayout ist ein starker Hinweis darauf, wofür es gedacht ist, es ist spezifisch für das CollectionView und keine allgemeine Methode zum Anzeigen von Elementen.

  2. Ich würde die ItemsLayout-Klasse in OrientedCollectionViewLayout umbenennen. Es ist ein starker Hinweis darauf, wofür die abstrakte Basisklasse wirklich ist. Alle abgeleiteten Klassen ordnen die Elemente orientiert an. Darüber hinaus bietet die Verwendung von "Oriented" im Namen die Möglichkeit, in Zukunft eine abstrakte Basisklasse namens "CollectionViewLayout" hinzuzufügen. wenn eine neue gemeinsame Funktionalität für alle Layoutklassen der Sammlungsansichten erforderlich ist, nicht nur für diejenigen, die eine Ausrichtung haben.

  3. ViewCell zu entfernen und einfach DataTemplate zu verwenden ist sehr willkommen, es verbessert die Wiederverwendbarkeit.

  1. Können Sie weitere Details zu RefreshView mitteilen?
    Ich nehme an, RefreshView sollte irgendwie UIRefreshControl auf iOS zugeordnet werden? Wie wird es auf Android und UWP funktionieren?

Falls es jemand interessiert, ich habe meinen ersten Kommentar oben aktualisiert.

Ich stimme @andreinitescu zu, dass es gut wäre, eine nicht scrollende Sammlung zu haben. Ich bin neutral, ob dies bedeutet, dass es in mehrere Klassen unterteilt wird oder möglicherweise so etwas wie eine ScrollMode-Eigenschaft hat. Ich werde mich an diejenigen wenden, die viel mehr Erfahrung im API-Design haben als ich. Es ist jedoch ziemlich trivial, Ihre eigene StackLayout-basierte Elementliste mit einer DataTemplate- oder Vorlagenauswahl zu implementieren, daher wird sie möglicherweise nicht benötigt.

Während mir die Idee der Steuerung der Scroll-Funktion gefällt, fallen mir auch keine überzeugenden Anwendungsfälle für eine nicht scrollende "Collection" ein, die alle erweiterten Funktionen von ListView oder der vorgeschlagenen CollectionView aus dem Kopf enthält. Mein Anwendungsfall für eine nicht scrollende Liste wurde immer durch die triviale Artikelliste gelöst. Mein normaler Grund, keine ListView zu verwenden, ist, dass ich keine Auswahl möchte oder die Liste horizontal anordnen möchte. Beide Fälle schienen von der vorgeschlagenen Spezifikation abgedeckt zu sein. Mich würden alle Anwendungsbeispiele interessieren, die jemand anderes für kein Scrollen hat.

@bmacombe Ich stimme Ihnen zu, dass es "einfach" ist, ein bindbares StackLayout zu implementieren, aber das ist meiner Meinung nach nicht der Punkt. Es ist eine sehr gängige Funktionalität, warum sie nicht im Framework haben? Und mit etwas Planung denke ich, dass es machbar ist. Wie ich oben bereits sagte, kann es gelöst werden, indem man einfach die Funktionalität in zwei Klassen aufteilt, eine Basisklasse (ähnlich ItemsControl in Windows XAML) und CollectionView (ListView). Idealerweise sollte es eine Selector-Klasse in der Hierarchie geben (siehe https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.primitives.selector)

Ich würde sagen, der triviale Grund für eine nicht scrollende Option ist, dass einige Seiten eine ScrollView für die gesamte Seite und eine Liste von Elementen benötigen.

Wenn Sie dies tun, wird derzeit nicht empfohlen, eine ListView in einer ScrollView zu platzieren. Ein bindbares CollectionView, das Sie dort einfügen könnten, das möglicherweise immer noch alle Funktionen eines ListViews hat, war etwas, das ich mehrmals brauchte.

Ich habe das gleiche BindableStack-Ding geschrieben, das alle anderen machen, aber ein Baked in One wäre viel schöner, damit zu arbeiten.

@adammeaney Das macht Sinn und ich habe es jetzt ähnlich gemacht, wenn ich darüber nachdenke.

@andreinitescu Ich bin nicht anderer Meinung, es wäre großartig, es integriert zu haben. Ich denke, alle sind sich

In meinen eigenen Frameworks gehe ich immer hin und her, indem ich viele Funktionen in ein Steuerelement einbaue oder viele ähnliche Klassen mit inkrementellen Funktionen habe. Ich werde gut damit sein, aber das Forms-Team beschließt, es am besten zu implementieren, insbesondere angesichts der zugrunde liegenden Plattformimplementierungen.

@bmacombe Mit etwas Planung hoffe ich, dass wir zwei Fliegen mit einer
Wenn beispielsweise eine Instanz der CollectionView-Klasse auf die von mir erwähnte Weise funktioniert, könnte sie, wenn sie kein IItemLayout-Set hat, einfach vom Renderer-Mechanismus einem nativen UIStackView auf iOS oder StackPanel auf UWP oder LinearLayout auf Android zugeordnet werden. Oder, um die Implementierung zu vereinfachen, könnte es einfach das vorhandene StackLayout verwenden, um Ansichten anzuordnen.

Mein Eindruck war , dass eine neue Listview beide fix Herausforderungen im Zusammenhang mit bestehenden Listview darauf abzielen soll , sondern auch eine Lösung für die „RepeatableBinder“ Gewinde bietet hier

Wir wollen sehen, wo ListView2 landet, bevor wir diese Spezifikation vorantreiben. Es enthält viele der gleichen benötigten Komponenten und es wäre am besten, eine Duplizierung dieser Komponenten zu vermeiden.

Ich sehe nicht, wie das Einfügen aller Funktionen in die CollectionView, wie die Spezifikation hier vorschlägt, die Arbeit richtig machen würde.

2680 Könnte dieser Spezifikation hinzugefügt werden? In Bezug auf die ScrollBar-Aktivierung.

@andreinitescu

Können Sie weitere Details zu RefreshView mitteilen?
Ich nehme an, RefreshView sollte irgendwie UIRefreshControl auf iOS zugeordnet werden? Wie wird es auf Android und UWP funktionieren?

Auf UWP verwenden wir wahrscheinlich RefreshContainer . Unter Android wahrscheinlich SwipeRefreshLayout .

@krdmllr

iOS verwendet bereits den UICollectionView-Namen, was bei der Suche nach CollectionView zu Verwirrung und falschen Google-Ergebnissen führen kann. Ist das ein Problem?

Es ist ein Problem, aber kein neues. Wir haben das gleiche Problem mit GestureRecognizer, ListView, Grid und vielen anderen Dingen in Forms. Wir hatten intern ein bisschen damit zu kämpfen; es gibt nur eine begrenzte Anzahl möglicher Namen für "ein Bündel von Elementen auf einem Bildschirm".

"CollectionView" kollidiert nicht mit allem, was wir derzeit in Forms haben, es kollidiert nicht mit UWP-Steuerelementnamen (wie es "ListView" tut) und es ist nicht _exakt_ wie UICollectionView (wegen des "UI"-Präfixes). Es ist nicht 100% ideal für Suchzwecke, aber wir sind der Meinung, dass es die Absicht des Steuerelements am besten zum Ausdruck bringt.

Das heißt, wenn jemand einen alternativen Namen vorschlägt, in den wir uns sofort verlieben, übernehme ich gerne die Suche und Ersetzung.

(Ich wollte es "ListView2ColonRevengeOfTheListView" nennen, aber @davidortinau hat mich erschossen :))

@dansiegel

Ein guter Kontext hierfür wäre, sich einen E-Mail-Client vorzustellen, in dem Sie möglicherweise ein Menü erhalten, wenn Sie nach links wischen und ein anderes, wenn Sie nach rechts wischen.

Werfen Sie einen Blick auf die

@GalaxiaGuy

Stapelsymbole unterstützen

Das ist ein toller Punkt, den sollten wir nach Möglichkeit unterstützen. Ich weiß, dass es mit den integrierten UWP-Glyphen funktioniert; Ich müsste ein wenig recherchieren, um sicherzustellen, dass diese Art des Stapelns auf den anderen Plattformen funktioniert (ich vermute, die Antwort lautet "ja").

Update: Der FontIconSource-Teil dieser Spezifikation wurde in eine eigene Spezifikation verschoben.

Ich wäre ein Benutzerszenario für die Mehrfachkommissionierung von Artikeln aus einer Auswahl, zum Beispiel die Auswahl eines oder mehrerer Fotos aus einem Album. Ein ziemlich häufiges Szenario in Apps wie OneDrive oder WhatsApp.

20180527_181626000_ios

@hartez

Das heißt, wenn jemand einen alternativen Namen vorschlägt, in den wir uns sofort verlieben, übernehme ich gerne die Suche und Ersetzung.

Ich habe aus verschiedenen Gründen bereits einen neuen Namen vorgeschlagen

Was wird der Wert von SelectedItem sein, wenn SelectionMode Multiple ? Mir fallen 5 Möglichkeiten ein:

  1. Das zuletzt ausgewählte Element in der Reihenfolge der Auswahl.
  2. Das zuletzt ausgewählte Element in der Reihenfolge der Quelle.
  3. Das zuletzt ausgewählte/abgewählte Element in der Reihenfolge der Auswahl.
  4. Das zuletzt ausgewählte/abgewählte Element in der Reihenfolge der Quelle.
  5. Null



    (2), (3) und (4) sind nicht sehr nützlich. Ich habe sie hinzugefügt, um alle Optionen abzudecken. (1) scheint die logischste Wahl zu sein. (5) wenn Sie SelectedItem überhaupt nicht unterstützen möchten, wenn SelectionMode Multiple .

@AmrAlSayed0

Welchen Wert hat SelectedItem, wenn SelectionMode Multiple ist?

Im Moment lautet die Antwort "was auch immer es war, bevor Sie SelectionMode auf Multiple umgestellt haben".

@rogihee

Ich würde ein Benutzerszenario für die Mehrfachkommissionierung von Artikeln aus einer Auswahl verwenden

Sie fragen, ob dieses Auswahlszenario unterstützt wird? AFAIK, alle nativen Steuerelemente, die wir verwenden möchten, unterstützen es, daher _sollte_ es in CollectionView unterstützt werden.

Ein bindbarer Stil für SelectionMode wäre nützlich, wenn SelectionMode=None, Transparent etc. ist, ist dies etwas, was Radlist tut, was eine sehr nützliche, einfache Möglichkeit ist, den visuellen Zustand basierend auf Bindungen zu handhaben. Ein Stil für jeden Auswahlmodus würde diese Szenarien abdecken.

@andreinitescu

Antworten auf Ihre Kommentare von https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -401015625 (und anderswo):

Sie sprechen viele gute Punkte an, und ich möchte sicherstellen, dass Sie wissen, dass wir sie nicht ignorieren. Wir kennen nur noch nicht alle Antworten. Wir sind dabei, diese API zu erweitern, damit wir sehen können, wo sie funktioniert und wo sie auseinanderfällt. Ich vermute, dass die Klassenaufteilung, die Sie vorschlagen, ziemlich nahe an dem Punkt liegt, an dem wir enden müssen.

Wir wissen, dass Sie (und einige andere) sehr daran interessiert sind, dass diese Zwischenklassen als StackLayouts und Grids von Vorlagenelementen (dh der "BindableRepeater") gerendert werden können, und das ist einer der Anwendungsfälle, die wir untersuchen.

@alexhardwicke

Im Allgemeinen fügen Sie in der neuen API Punkte hinzu, an denen wir das Verhalten bei Bedarf erweitern können.

Die UpdateX Methoden in den Renderern sind protected virtual . :)

Im Ernst, wir sind uns bewusst, dass dies in der Vergangenheit ein Problem war, und wir behalten es beim Schreiben von CollectionView im Hinterkopf.

  1. Beim zweiten Nachdenken glaube ich wirklich nicht, dass CollectionView eine gute Wahl für den Klassennamen dieser Ansicht ist.
    In Windows XAML ist eine CollectionView die Basisklasse für eine Datenquelle von Elementen, die zum Filtern der Gruppierung verwendet wird, siehe https://msdn.microsoft.com/en-us/library/system.windows.data.collectionview (v=vs. 110).aspx
    Vielleicht bekommt Xamarin Forms irgendwann eine Klasse für den gleichen Zweck, und ich denke, es macht Sinn, wenn sie den gleichen Namen hat (CollectionView), insbesondere wenn man über den XAML-Standard nachdenkt (ist das noch geplant?)

    So hässlich und lustig es auch klingen mag, ListView2 ist eine gute Wahl :) Es wird in .NET empfohlen, Suffixe für die Versionierung zu verwenden, wenn der vorhandene Name der einzige sinnvolle Name ist:

    Verwenden Sie ein numerisches Suffix, um eine neue Version einer vorhandenen API anzugeben, insbesondere wenn der vorhandene Name der API der einzige sinnvolle Name ist (dh wenn es sich um einen Industriestandard handelt) und wenn Sie ein sinnvolles Suffix hinzufügen (oder das . ändern) Name) ist keine geeignete Option.

    _Framework-Designrichtlinien: Konventionen, Redewendungen und Muster für wiederverwendbare .NET-Bibliotheken, 2. Auflage_
    https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/general-naming-conventions

    Irgendwann später wird jeder das neue, glänzende benutzen. stabiles und performantes ListView2 :). Schneller Vorlauf, die Umbenennung von ListView2 in ListView, wenn auch eine bahnbrechende Änderung, wird für alle eine einfache (und willkommene) Umgestaltung sein.

  2. In Xamarin Forms gibt es bereits eine ItemsViewdie ItemsControl in Windows XAML sehr ähnlich sieht, außer dass sie keine items-Layout-Eigenschaft hat.
    Anstatt eine neue CollectionView-Klasse zu erstellen, wäre es möglich, vorhandene ItemsView zu verwendenauch als Basisklasse für das neue ListView?

  3. Es gibt eine offensichtliche Herausforderung beim API-Design und der Implementierung, bei der Verwendung der nativen Plattformsteuerelemente, die Listenelemente anzeigen, aber dennoch die Flexibilität haben, so etwas wie den "BindableRepeater" zu haben, der ein einfaches, leichteres, nicht scrollbares und nicht -auswählbare Liste von Elementen.
    Scheint, als hätte Uno es geschafft:

Wäre es möglich, anstatt eine neue CollectionView-Klasse zu erstellen, vorhandene ItemsView auch als Basisklasse für die neue ListView zu verwenden?

Es gibt ItemsView<T> , aber das möchten wir nicht verwenden. Es verwendet TemplatedItemsList , was ein Teil des Crufts ist, den wir mit diesem neuen Steuerelement vermeiden wollen.

Irgendwann später wird jeder das neue, glänzende benutzen. stabiles und performantes ListView2 :). Schneller Vorlauf, die Umbenennung von ListView2 in ListView, wenn auch eine bahnbrechende Änderung, wird für alle eine einfache (und willkommene) Umgestaltung sein.

Ihr Optimismus ist charmant, aber wir müssen davon ausgehen, dass ListView(1) für immer gilt und dass eine grundlegende Änderung wie eine Umbenennung von ListView2 nicht zulässig ist.

Ich dachte, es wäre sinnvoll, mit Windows XAML auf Augenhöhe zu sein, aber ok, verwenden Sie einen beliebigen Namen, solange das neue Steuerelement sein Versprechen hält. Dem Uno-Framework schien dies gelungen zu sein, daher bin ich jetzt gespannt, was Sie in Xamarin Forms einbringen.

@gmwilhelm

https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -400925994

Guter Punkt. Ich habe das vorläufig der API hinzugefügt. Ich sage vorläufig, weil ich völlig sehen kann, wie wir es auf iOS und Android implementieren könnten, aber UWP könnte eine Herausforderung sein.

Aber ich kann nicht leugnen, dass es sowohl vernünftig als auch angenehm symmetrisch ist.

Wie wäre es mit GroupItemsBinding hinzufügen?

Dadurch könnte eine Group eine Sammlungstypeigenschaft enthalten , anstatt zu erfordern, dass eine Gruppe von einer Sammlung abgeleitet wird, wie dies bei ListView der Fall ist. Diese bestehende ListView-Einschränkung hat mich gezwungen, bei mehreren Gelegenheiten eine leistungsintensive Duplizierung von gruppierten Datenstrukturen durchzuführen. Das Hinzufügen von GroupItemsBinding würde dies verhindern und eine flexiblere Zuordnung zu gruppierten Datenstrukturen ermöglichen.

Dh das in der

```C#
class Group // Beachten Sie, dass Group nicht von ObservableCollection abgeleitet werden muss
{
öffentliche Gruppe (string firstInitial) { FirstInitial = firstInitial; }

public string FirstInitial { get; private set; }

public ObservableCollection<Person> Persons { get; set; } // We use a property for the group items instead

}

ListView CreateListView()
{
var listView = neue ListView {
GroupItemsBinding = neue Bindung (nameof(Group.Persons))
// ...
};
// ...
}

```

Da dies eine Teilmenge dessen ist, was UICollectionView in Bezug auf das Layout tut, sollten wir einen anderen Namen wählen, um Verwechslungen mit den Funktionen des Steuerelements zu vermeiden.

Nur um es klarzustellen, dieses Steuerelement ist noch nicht verfügbar, richtig? Ich habe versucht, darauf zu verweisen, aber mein Projekt kann es nicht finden

@titonton Dieses Problem dient nur zur Diskussion der Spezifikation für CollectionView, die Implementierung hat noch nicht einmal begonnen, und ich glaube nicht, dass dies der Fall sein wird, bis die Spezifikation fertiggestellt ist.

@AmrAlSayed0 Eigentlich hätte es

Es ist ziemlich unklar, wie dies begonnen wurde, da nicht klar ist, wie die Entscheidung über die API lautet

@opcodewriter Das dachte ich mir. @AmrAlSayed0 Vielen Dank für die Klarstellung.

Könnte jemand den aktuellen Stand dieser Spezifikation klären? Fehlt etwas, wo die Community helfen kann?

@migueldeicaza @hartez Dies wird schwierig zu benennen, wenn Sie nicht möchten, dass es CollectionView . Wie wäre es mit CatalogView ?

1

Kataloge werden oft in einer oder mehreren Spalten und mit mehreren Zeilen von Elementen mit ähnlichen Schriftarten, Texten, Layouts usw.

Probe:

022

@hartez Haben Sie das Gefühl, dass die APIs jetzt

@adrianknight89 Ich glaube, das ist der funktionierende Zweig. https://github.com/xamarin/Xamarin.Forms/tree/lv2spike

Wir gehen davon aus, dass es noch eine Weile nicht zur Vorschau bereit sein wird, aber ich werde die Ergebnisse der aktuellen Bemühungen in den kommenden Wochen präsentieren/demonstrieren, um den Fortschritt zu überprüfen und Feedback zu geben.

Ich bin verwirrt. Da Sie bereits einige interne Demos hatten, scheint es, dass Sie mit der Implementierung schon ziemlich weit sind.
Sollte dies nicht bedeuten, dass viele der APIs festgenagelt wurden? Folgen Sie den API-Spezifikationen hier?
Ich kann nicht sehen, wie die aktuelle Spezifikation das ansprechen kann, was hier und im anderen Thread hier besprochen wurde https://github.com/xamarin/Xamarin.Forms/issues/1718
Genauer gesagt ist die API nicht flexibel genug, um beispielsweise ein einfaches nicht-scrollbares und bindbares StackLayout-ähnliches Steuerelement zu ermöglichen.

Ermöglicht das neue Steuerelement, gebundene Elemente in einem Stapel ohne Bildlaufleiste zu platzieren, genau wie StackLayout ?

Danke schon lange darauf gewartet 👍

Nach vielen internen Diskussionen und Versuchen, eine geeignete Architektur zu erarbeiten, haben wir uns entschieden, dass CollectionView die in #1718 besprochenen Layout-Szenarien _nicht_ behandeln wird. Mit anderen Worten, es wird nicht die Bindung einer Auflistung von Objekten an Elemente in xamarin.Forms-Layouts behandelt.

Das ursprüngliche Ziel von CollectionView war es, Benutzern die einfache Nutzung der verschiedenen modernen nativen Listen-/Grid-Steuerelemente (UICollectionView, RecyclerView, ListView/GridView usw.) zu ermöglichen.

Es war verlockend zu versuchen, CollectionView zu einem One-Stop-Control für alle "Rendern und Anordnen dieser Vorlage mit Daten" zu machen, einschließlich aller Szenarien, in denen der Schritt "Anordnen" von Formularlayouts (FlexLayout, StackLayout usw. ). Und es gibt einige offensichtliche Funktionsüberschneidungen (zB verwenden beide Szenarien DataTemplates). Aber am Ende haben sie einen großen grundlegenden Unterschied in der Architektur, und der Versuch, sie zusammenzufügen, würde zu etwas schwieriger zu verwalten und zu verwirrender führen, als sie einfach als separate Steuerelemente zu belassen. Wir wollten nicht etwas so Komplexes erstellen, dass wir ListView3 in ein paar Jahren implementieren müssen. Darauf werde ich weiter unten näher eingehen.

Das Ergebnis davon ist, dass CollectionView sich weiterhin auf das Problem konzentriert, Forms-Benutzern zu ermöglichen, die nativen Listen-/Grid-Steuerelemente zu verwenden und von ihren Layout-Engines und Virtualisierung zu profitieren. Und #1718 wird aktualisiert, um eine API widerzuspiegeln, die es Forms-Benutzern ermöglicht, ItemsSource und ItemTemplate an die verschiedenen Formularlayout-Engines zu binden.

Für diejenigen, die sich für das _Warum_ von zwei Kontrollen im Vergleich zu einer interessieren:

Der grundlegende Unterschied zwischen dem, was hier (als CollectionView) skizziert wurde, und dem Vorschlag in #1718 besteht darin, _wo_ das Layout auftritt.

CollectionView zielt darauf ab, die nativen Layout-Engines (die von den Plattformentwicklern stark optimiert wurden) zu verwenden, um das Layout zu handhaben. Etwas benutzerdefinierter Code von Forms wird involviert (z. B. bei der Bereitstellung von Dingen wie der SnapPoints-Logik auf Android und iOS), aber zum größten Teil übernehmen die nativen Layout-Engines (und native Virtualisierungsimplementierungen) die schwere Arbeit. Dies macht einen großen Unterschied in Bezug auf die Leistung.

Alle Layout-Informationen, die der Entwickler CollectionView zur Verfügung stellt, werden also lediglich zur Interpretation an den Renderer auf jeder Plattform weitergegeben; Es ist praktisch eine Spezifikation, die in die lokale Sprache übersetzt wird (LinearLayoutManager/GridLayoutManager auf Android, UICollectionViewFlowLayout auf iOS usw.). Über die DataTemplate hinaus übernimmt Forms keine Layoutarbeit.

Im Gegensatz dazu wird ein Formularlayout (FlexLayout, StackLayout, AbsoluteLayout usw.) vollständig in der Formularebene angeordnet. Die Renderer für ein Formularlayout tun sehr wenig. Und es findet keine Virtualisierung statt; Alle Artikel werden von Anfang an erstellt und im Layout platziert.

Der Versuch, diese beiden Dinge miteinander zu verbinden, führt zu einigen schwierigen Fragen, darunter:

  1. Wie funktioniert das Renderer-Mapping? Eine CollectionView, die ein StackLayout verwendet, hat einen ganz anderen Renderer als eine CollectionView, die eine RecyclerView verwenden muss. Müssen wir sie zusammen und verstecken den RecyclerView, wenn wir ihn nicht brauchen? Haben wir den Renderer von DefaultRenderer abgeleitet? Wenn wir das tun, haben wir immer eine zusätzliche ViewGroup-Ebene, die wir nicht wirklich brauchen ...

  2. Wie gehen wir mit ScrollViews um? UICollectionView verarbeitet seine eigene scrollende Anzeige, aber wenn ein StackLayout scrollen muss, fügt der Benutzer es normalerweise manuell in Forms hinzu. Fügen wir eine weitere Ebene hinzu, um das Scrollen bei Bedarf automatisch einzufügen? Deaktivieren/entfernen wir eine manuell hinzugefügte ScrollView, wenn das Layout eine UICollectionView erfordert?

  3. Wohin gehen die ScrollTo-Methoden?

... und so weiter. Alle diese Probleme sind _lösbar_, aber jede Lösung fügt _Komplexität_ hinzu. Und wie in #1718 gezeigt wurde, ist das Hinzufügen von ItemsSource und ItemsTemplate zu einem Formularlayout nicht allzu schwierig oder komplex. Es komplex zu machen, nur diese beiden unterschiedlichen Szenarien zusammenzufügen, ist die Vorteile nicht wert.

Ich bin verwirrt. Da Sie bereits einige interne Demos hatten, scheint es, dass Sie mit der Implementierung schon ziemlich weit sind. Sollte dies nicht bedeuten, dass viele der APIs festgenagelt wurden? Folgen Sie den API-Spezifikationen hier?

Wir folgen der hier veröffentlichten API. "Ganz weit" ist wahrscheinlich übertrieben; Bisher haben wir einige der nicht umstrittenen Teile der Spezifikation implementiert, um zu überprüfen, ob sie möglich sind und wir keine Sackgassen gehen. Vorausgesetzt, wir haben keine Probleme, wird vieles von dem, was wir bisher implementiert haben, wahrscheinlich in der veröffentlichten Version enthalten sein. Aber alles in der Spezifikation kann sich noch ändern, ebenso wie alles, was wir bisher implementiert haben.

Ich kann nicht sehen, wie die aktuelle Spezifikation das behandeln kann, was hier und im anderen Thread hier #1718 diskutiert wurde. Genauer gesagt ist die API nicht flexibel genug, um beispielsweise ein einfaches nicht-scrollbares und bindbares StackLayout-ähnliches Steuerelement zu ermöglichen.

Stimmt, und ein Teil dessen, woran wir gearbeitet haben, ist festzustellen, ob CollectionView diese Anwendungsfälle angemessen abdecken könnte. Wir haben uns dazu entschieden; siehe https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment -424413234.

Da dies eine Teilmenge dessen ist, was UICollectionView in Bezug auf das Layout tut, sollten wir einen anderen Namen wählen, um Verwechslungen mit den Funktionen des Steuerelements zu vermeiden.

Wie gesagt (https://github.com/xamarin/Xamarin.Forms/issues/3172#issuecomment-401186893) bin ich offen für andere Namen.

Wie wäre es mit CatalogView?

Kataloge werden oft in einer oder mehreren Spalten und mit mehreren Zeilen von Elementen mit ähnlichen Schriftarten, Texten, Layouts usw.

Dies ist eine interessante Idee. Es steht definitiv nicht in Konflikt mit bestehenden Steuerelementnamen.

@hartez Als zufälliger Typ im Internet, der sich mit den Interna von Xamarin Forms vertraut macht (und bereits mit UITableView und UICollectionView vertraut war), denke ich, dass dies der richtige Schritt ist.

Wird es weiterhin möglich sein, ein benutzerdefiniertes Layout bereitzustellen (auch wenn dies die Bereitstellung separater Implementierungen pro Plattform bedeutet)?

Wird es weiterhin möglich sein, ein benutzerdefiniertes Layout bereitzustellen (auch wenn dies die Bereitstellung separater Implementierungen pro Plattform bedeutet)?

Absolut. Sie können Ihr eigenes Layout bereitstellen, das mit IItemsLayout gekennzeichnet ist, und Ihr benutzerdefinierter Renderer kann es nach Belieben interpretieren.

Als Proof-of-Concept habe ich beispielsweise den Android-Renderer für CollectionView untergeordnet und die Möglichkeit hinzugefügt, eine Klasse FlexLayout : IItemsLayout zu interpretieren, die eine Reihe von Flex-Layout-Eigenschaften enthält. Es übergibt diese Eigenschaften an den FlexBoxLayoutManager von Google und verwendet diesen Layout-Manager mit RecyclerView. Sobald wir eine öffentliche Vorschau verfügbar machen, werde ich dieses Beispiel wahrscheinlich auf GitHub veröffentlichen, damit die Leute eine einfache Referenz haben, wie man so etwas macht.

Das Ziel ist, dieses Ding sehr, sehr flexibel zu machen.

@hartez
Wird das in https://github.com/xamarin/Xamarin.Forms/issues/3749 beschriebene Problem mit CollectionView behoben?
Denn hier sehe ich, dass CollectionView nur die Eigenschaft ItemTemplate , was so klingt, als hätte es das gleiche Problem wie ListView .

@hartez
Ist das in #3749 beschriebene Problem mit CollectionView behoben?
Denn hier sehe ich, dass CollectionView nur die Eigenschaft ItemTemplate , was so klingt, als hätte es das gleiche Problem wie ListView .

@andreinitescu Vielen Dank für den Hinweis auf diese Diskussion. Dieses Problem mit DataTemplate war mir nicht bekannt.

Ich werde nächste Woche etwas Zeit damit verbringen, mir die Geschichte von DataTemplate anzusehen - warum es so konzipiert ist und ob es Abwärtskompatibilitätsprobleme bei der Behebung von CreateContent um einfach automatisch das Richtige zu tun (beide in ListView und CollectionView).

@hartez Nur als Beispiel dafür, wie ich dieses Problem beim Erstellen meiner eigenen Repeater-Steuerung

//Überprüfen Sie, ob wir einen Vorlagenselektor oder nur eine Vorlage haben
var templateToUse = itemTemplate ist DataTemplateSelector templateSelector ? templateSelector.SelectTemplate(item, null) : itemTemplate;

In einem solchen Fall würde es also nicht kaputt gehen, CreateContent einfach nur zu reparieren, sondern es einfach unnötig machen. Aber ich stimme @andreinitescu zu, dass die Trennung von ItemTemplate und ItemTemplateSelector als separate Eigenschaften ideal wäre ... wahrscheinlich aufgrund meines WPF- und SL-Hintergrunds.

@bmacombe IMHO, Es ist nicht nur eine Frage der Präferenz, es an WPF / SL

@andreinitescu Es führt zu Verwirrung :) Glauben Sie mir, ich war zuerst verwirrt, als ich versuchte, DataTemplate und DataTemplateSelector in meinem Repeater zu unterstützen! Vor allem, wenn ein Fehler aufgetreten ist, als ich meiner DataTemplate-Eigenschaft einen DateTemplateSelector zugewiesen habe, als er an allen XF-Orten funktionierte, die ihn verwendet haben. Um das herauszufinden, brauchte ich einige Quellcode-Ausgrabungen. Wahrscheinlich ist das kein Problem für jemanden, der nur die integrierten XF-Steuerelemente verwendet, aber zu versuchen, sie zu besitzen und zu verwenden ... wirklich verwirrend.

Können wir bitte ein Scroll-Event auf CollectionView haben? Bis CollectionView veröffentlicht wird, habe ich einen Vorschlag für ListView https://github.com/xamarin/Xamarin.Forms/issues/4323

Und wird es möglich sein, unregelmäßige und dynamische Layouts zu erstellen, wie zum Beispiel PInterest:

Du siehst, jedes Bild hat seine eigene Höhe :-)

Sie sind sich nicht sicher, ob diese Art von Layout unterstützt werden kann?

image

Update: Von der Liste der Namensvorschläge ist "ItemsView" am nächsten gekommen, um die Verwendung des Begriffs "CollectionView" zu vermeiden, der den Eindruck erweckt, dass dies so vollständig ist wie das iOS "UICollectionView".

Hallo, ich bin noch neu bei Xamarin, habe aber mit ListView mithilfe von DataTemplateSelector gearbeitet.
Als ich versucht habe, CollectionView mit DataTemplateSelector zu testen, wird ein Fehler ausgegeben

Unbehandelte Ausnahme:

System.InvalidOperationException: LoadTemplate darf nicht null sein

Gibt es einen bekannten Fehler im Zusammenhang mit DataTemplateSelector?
Ich könnte es falsch implementieren. Gibt es ein Beispiel für die Verwendung von DataTemplateSelector mit CollectionView?

@hartez @davidortinau irgendein Grund, warum KeepItemsInView nicht KeepFirstItemInView , um sich an KeepLastItemInView auszurichten? Der aktuelle Name ist Plural (dh schlägt mehrere Elemente vor), während die Beschreibung besagt, dass nur das erste sichtbare Element im Ansichtsfenster beibehalten wird.

Gibt es auch eine Möglichkeit, eine API bereitzustellen, um die Liste der Ansichten abzurufen, die sich derzeit im Ansichtsfenster befinden? Neulich habe ich daran gearbeitet, eine Videoansicht zu erstellen, die in eine ListView Zelle eingebettet und basierend auf der Sichtbarkeit des Ansichtsfensters automatisch abgespielt/angehalten werden sollte, aber mit den aktuellen ItemAppearing und ItemDisappearing war dies fast unmöglich. CollectionView diese Art von Funktionalität zuverlässiger unterstützt.

autoplayvideos demo

Eine andere Sache, die großartig wäre, wäre die Möglichkeit, eine abhängige, minimierte Ansicht zu erstellen, die von der übergeordneten Ansicht getrennt ist, während der Benutzer den Luxus hat, im aktuellen Feed zu scrollen. Ich habe dies auf YouTube gesehen, da wir jetzt das aktuelle Video weiterhin ansehen und gleichzeitig weiterstöbern können. Ich bin mir nicht sicher, ob dies etwas ist, das CollectionView im Übrigen unterstützen kann oder sollte, aber es ist etwas, worüber man nachdenken sollte.

youtube1-5abab8210e23d9003787855d

Also habe ich ein bisschen mit dem aktuellen Nightly-Build herumgespielt (4.0.1.43780-nightly), wodurch einige Größenänderungsprobleme im Vergleich zum aktuellen Preview-Build behoben wurden.

Ein Vorschlag, den ich hätte, wäre, Rasterlayouts wie RowSpacing/ColumnSpacing oder GridSpacing hinzuzufügen, da dies es viel einfacher macht, Ihre Elemente richtig zu platzieren, ohne die einzelnen Elemente mit Rand/Auffüllung zu versehen.
Eine andere Sache wäre, Padding oder vielleicht EdgeOffset zu CollectionView oder Layout hinzuzufügen, um die Verwendung von Margin zu vermeiden, die die Elemente wie hier gezeigt schneidet:
android-margin-image
Margin beschneidet auch die "Drag"-Animation auf Android, wie Sie hier sehen können:
android-margin

Ein Vorschlag, den ich hätte, wäre, Rasterlayouts wie RowSpacing/ColumnSpacing oder GridSpacing hinzuzufügen, da dies es viel einfacher macht, Ihre Elemente richtig zu platzieren, ohne die einzelnen Elemente mit Rand/Auffüllung zu versehen.

Einverstanden, und das ist auf unserem Radar - siehe #4681.

Update: Von der Liste der Namensvorschläge ist "ItemsView" am nächsten gekommen, um die Verwendung des Begriffs "CollectionView" zu vermeiden, der den Eindruck erweckt, dass dies so vollständig ist wie das iOS "UICollectionView".

Was ist mit "FloatView"?

Neben den oben erwähnten ItemAppearing/Disappearing-Ereignissen gibt es Pläne für Möglichkeiten, einen Artikel anzuzeigen:
View GetView(object item)
Wenn das Element nicht materialisiert wird, sollte es null zurückgeben, denke ich.

Ich verwende eine vertikale Liste und es scheint Inkonsistenzen bei der Darstellung auf iOS im Vergleich zu Android zu geben.

Unter iOS nimmt das Label 100 % der Breite ein.
screenshot 2019-01-15 13 56 01

Auf Android nimmt es nur die Inhaltsbreite ein.
screenshot 2019-01-15 13 57 59

Ich konnte es nur mit einer statischen Breitendefinition richtig zum Layout bringen.
Gibt es eine Android-Problemumgehung, die die Eigenschaft Grid Width="Auto" respektiert?

Ich verwende eine vertikale Liste und es scheint Inkonsistenzen bei der Darstellung auf iOS im Vergleich zu Android zu geben.

@shwanton Bitte öffnen Sie ein separates Problem für diesen Fehler, und ich werde es mir ansehen.

@shwanton Ich hatte

@krdmllr Ich kann bestätigen, es wurde im neuesten Build behoben. Danke schön.

Hallo. Wird es in CollectionView ein ItemTapped-Ereignis geben, das dem ItemTapped von ListView ähnelt? Ich sehe es nicht in der Spezifikation. Danke schön.

@uvirra Es gibt ein bestehendes Problem für Ihre DataTemplateSelector Anfrage. Siehe #4826.

@hartez Wird es jemals eine Notwendigkeit für eine Strategie zum Recycling von Gegenständen geben, wie die drei, die es für ListView ? Sie haben mehrmals die native Virtualisierung erwähnt, die CollectionView nutzt. Ich möchte nur mehr Klarheit darüber bekommen.

Ich bin auch gespannt, wie RefreshView auf iOS aussehen wird. Die aktuelle Aktualisierung für ListView erfordert, dass die Eigenschaft Bounces ListView von UITableView aktiviert ist, während unter Android die Aktualisierungsansicht über dem am meisten sichtbaren Element angezeigt wird (was ich persönlich bevorzuge).

@hartez Wird es jemals eine Notwendigkeit für eine Strategie zum Recycling von Gegenständen geben, wie die drei, die es für ListView ? Sie haben mehrmals die native Virtualisierung erwähnt, die CollectionView nutzt. Ich möchte nur mehr Klarheit darüber bekommen.

Das aktuelle Design verlangt nicht nach einer Recyclingstrategie. Im Moment nutzen wir einfach die Virtualisierung, die von den nativen Steuerelementen bereitgestellt wird, die sofort eine sehr gute Arbeit leisten.

Wird es jemals einen Bedarf geben? Meine Hoffnung ist "nein", und wir werden unser Bestes tun, um dies zu vermeiden, da es eine Menge Komplexität hinzufügt (sowohl für Benutzer als auch für die Wartung). Wenn wir irgendwann zu dem Schluss kommen, dass wir so etwas brauchen, werden wir sehr, sehr vorsichtig an das Design herangehen.

Was ist mit dem gescrollten Ereignis? Die meisten modernen UI/UX bieten Parallax-Header, zeigen/verbergen Elemente (Schaltflächen, Header, Filter usw.) beim Scrollen und ähnliches.
Ich denke, dass eine neue, erstaunliche Steuerung wie diese moderne Szenarien unterstützen sollte.

Es sollte kein Problem sein, sowohl recyclerview als auch UICollectionview unterstützen das gescrollte Ereignis sofort.

Sogar der Carouselview (basierend auf collectionview) unterstützt das scrolled Event mit Richtung, Scrolling Wert und Delta: https://github.com/xamarin/Xamarin.Forms/issues/4996

Um auf den Kommentar von @Evolutionlab zu folgen,

https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/listview-and-gridview-data-optimization

Wenn dies zu viel zu verstehen ist, möchte ich Zugriff auf VisibleItems erhalten, damit ich stattdessen in meinem ViewModel virtualisieren kann.

Mach weiter so!

@hartez Ich dachte nur, es wäre cool, Entwickler einen Mindest-/Höchstschwellenwert für die Anzahl der ausgewählten Elemente definieren zu lassen. Ich erstelle derzeit eine benutzerdefinierte Fotogalerie, in der nicht mehr als 5 Fotos ausgewählt werden können. Wenn der Schwellenwert erreicht ist, sollten Tap-Ereignisse in Zellen ignoriert werden, es sei denn, sie deaktivieren Elemente.

Dies könnte auch durch Setzen von SelectedItems (was noch nicht implementiert wurde) auf SelectionChanged Ereignis basierend auf CurrentSelection Anzahl gesetzt werden, aber dies wird SelectionChanged auslösen

Als ich heute ein bisschen mit CollectionView herumgespielt habe, ist mir aufgefallen, dass UWP viel weiter hinter Android und iOS liegt, was ich unter dem Grund verstehe.

Möchten Sie nur bestätigen, dass nach Fertigstellung die vollständige UWP-Unterstützung geplant ist?

Neben den oben erwähnten ItemAppearing/Disappearing-Ereignissen gibt es Pläne für Möglichkeiten, einen Artikel anzuzeigen:
View GetView(object item)
Wenn das Element nicht materialisiert wird, sollte es null zurückgeben, denke ich.

Was ist mit ItemAppearing? Ich sehe keine Neuigkeiten dazu

Ich spielte mit dem CollectionView herum und hatte Probleme mit ungleichmäßiger Reihenhöhe. Ich habe gesehen, dass in letzter Zeit ein ItemSizingStrategy eingeführt wurde, aber es verhält sich immer noch seltsam.

Ich habe mit dem DataTemplateGallery herumgespielt und beim Wechsel zu MeasureAllItems erhalte ich folgendes Ergebnis (iPhone 6, iOS 12.1.4):

Nach dem Wischen nach rechts und dem Zurückkommen ändert sich das Ergebnis zu:

@hartez Wird erwartet, dass dies funktioniert oder noch in Arbeit ist (konnte kein Problem dafür finden)?

Ist RemainingItemsThresholdReached bereits implementiert?

Es ist für das CollectionView-Steuerelement-XAML in 4.0.0.169046-pre5 nicht verfügbar.

Kann mir jemand sagen, dass RemainingItemsThresholdReached Teil von 4.0 Release ist? Wenn ja, können Sie uns bitte einen Beispielcode zur Verwendung dieser Funktion geben.

@Dresel Können Sie ein neues Ticket eröffnen, wenn Sie der Meinung sind, dass dies ein Fehler ist? Es ist besser, wenn es verfolgt wird.

@melucas @chandrubk Ich glaube nicht, dass an RemainingItemsThresholdReached noch gearbeitet wird.

https://github.com/xamarin/Xamarin.Forms/branches/all

Auch ich möchte, dass diese Funktion (zusammen mit der Aktualisierungsansicht) bald implementiert wird, da ich ohne sie CollectionView nicht mehr berühren kann.

4323

Wir brauchen das Scrolled Event wie ScrollView tun

Grüße,

4323

Wir brauchen das Scrolled Event wie ScrollView tun

Grüße,

Ich unterstütze dies.
Darüber hinaus wäre es großartig, ein Ereignis zu erhalten, wenn das Scrollen gestoppt/beendet ist.

In IOS ist die UICollectionview eine Unterklasse von UIScrollview, sodass wir scrollViewDidEndDecelerating aus den UIScrollViewDelegate

In Android denke ich, dass wir die RecyclerView.OnScrollListener ?

Dadurch werden erweiterte und ausgefeiltere Szenarien für benutzerdefinierte Aktualisierung, Parallaxe, synchronisierte Bildlaufelemente usw. geöffnet.

Gibt es eine Chance, dass es eine sofort einsatzbereite Animation für Android gibt, wie die der Recycler-Ansicht?

Gibt es eine Chance, dass es eine sofort einsatzbereite Animation für Android gibt, wie die der Recycler-Ansicht?

Welche Animationen meinst du? Der Android-Renderer dafür basiert auf RecyclerView, verwendet also bereits die Standardanimationen für Dinge wie das Hinzufügen/Entfernen von Elementen.

Hallo,

Ich verwende 4.0.0.304370-pre8.
Das Beispiel von (Link unten) zeigt nichts auf UWP an, wenn CarouselView verwendet wird.
CollectionView zeigt die Liste jedoch an. Ist eine bestimmte Konfiguration erforderlich, um CarouselView für UWP zu aktivieren?

https://devblogs.microsoft.com/xamarin/xamarin-forms-4-0-feature-preview-an-entirely-new-point-of-collectionview/

Danke.

Hallo @noypi ,

Während CollectionView technisch in eher geringem Maße auf UWP "arbeiten" kann, wird die vollständige Implementierung von CollectionView und CarouselView zunächst ausschließlich auf Android und iOS durchgeführt. Derzeit sind keine offiziellen Arbeiten für UWP geplant, aber wir sammeln kontinuierlich Feedback. Wenn Sie besprechen möchten, welche Art von Arbeit Sie speziell an UWP leisten, können Sie mir eine E-Mail an paul senden. [email protected].

Wird TableView laut Spezifikation vollständig durch CollectionView ersetzt?

Eine andere Frage: Da es keine Zellen mehr gibt, wie füge ich einen Verfärbungsindikator für iOS hinzu? Mit ListView war dies über einen benutzerdefinierten Renderer möglich.

Wird TableView laut Spezifikation vollständig durch CollectionView ersetzt?

TableView wird weiterhin existieren. Wir werden keine vorhandenen Steuerelemente entfernen.

Eine andere Frage: Da es keine Zellen mehr gibt, wie füge ich einen Verfärbungsindikator für iOS hinzu? Mit ListView war dies über einen benutzerdefinierten Renderer möglich.

Unter iOS rendert CollectionView mithilfe einer UICollectionView, was bedeutet, dass seine Zellen UICollectionViewCells sind. Und UICollectionViewCells haben keine zusätzlichen Ansichten (wie Offenlegungsindikatoren). Für alle UI-Elemente wie Offenlegungsindikatoren oder Häkchen müssen Sie diese also in Ihrer ItemTemplate erstellen.

Wie deaktiviere ich die Auswahl für bestimmte Arten von Elementen? Ich habe mehrere Datenvorlagen und möchte die Auswahl für einige davon deaktivieren.

@hartez Beim Festlegen von ItemTemplate auf DataTemplateSelector bekomme ich eine Ausnahme: System.InvalidOperationException: LoadTemplate should not be null

Ich dachte, dass Vorlagen sofort unterstützt werden

@hartez Beim Festlegen von ItemTemplate auf DataTemplateSelector bekomme ich eine Ausnahme: System.InvalidOperationException: LoadTemplate should not be null

Ich dachte, dass Vorlagen sofort unterstützt werden

Sie sollten sein; vielleicht stoßen Sie auf einen Fehler. Bitte eröffnen Sie ein Problem, damit wir es untersuchen können.

@toomasz Bevor Sie ein Problem öffnen, können Sie Ihr Nuget bitte auf die neueste Vorabversion (oder die nächtliche) aktualisieren und den Selektor erneut testen? Das Problem, das Sie sehen, trat auf, als es keine Unterstützung für DataTemplateSelector .

@hartez Wird derzeit an der Kopf- und Fußzeile sowie der Aktualisierungsansicht gearbeitet? Wenn ich Zeit habe, schaue ich mir vielleicht einen von beiden an, aber ich möchte sichergehen, dass ich Ihnen nicht auf die Zehen trete.

@adrianknight89 Es funktioniert auf 4.0! Genial

@hartez Wird derzeit an der Kopf- und Fußzeile sowie der Aktualisierungsansicht gearbeitet? Wenn ich Zeit habe, schaue ich mir vielleicht einen von beiden an, aber ich möchte sichergehen, dass ich Ihnen nicht auf die Zehen trete.

Im Moment wird nichts gemacht - wenn du mal reinschnuppern willst, wäre das toll.
Nur ein Hinweis, nach einigen Diskussionen haben wir heute zwei neue Eigenschaften in Bezug auf Kopf- und Fußzeilen hinzugefügt - IsHeaderSticky und IsFooterSticky , um anzugeben, ob sie mit den Elementen scrollen oder an Ort und Stelle bleiben. Wenn Sie diese zusammen mit der Kopf-/Fußzeile angehen möchten, wäre das großartig, aber es wäre auch großartig, wenn wir sie auf die eine oder andere Weise arbeiten lassen und diese Eigenschaften später implementieren könnten.

Gibt es einen Plan, die Sammlungsansicht in UWP zu unterstützen?

Ja. Die Implementierung liegt derzeit etwas hinter den anderen Plattformen zurück, aber es ist geplant, sie vollständig zu unterstützen. Sie können den Fortschritt der Funktion unter https://gist.github.com/hartez/7d0edd4182dbc7de65cebc6c67f72e14 verfolgen

Irgendwelche Informationen zu RefreshView?
Ich habe die neueste Betaversion von Xamarin 4 und der Typ RefreshView kann nicht gefunden werden

Irgendwelche Informationen zu RefreshView?
Ich habe die neueste Betaversion von Xamarin 4 und der Typ RefreshView kann nicht gefunden werden

RefreshView wurde noch nicht implementiert. Sie können den Funktionsfortschritt hier verfolgen.

GroupItemsBinding hinzufügen ?

Wie wäre es mit dem Hinzufügen einer GroupItemsBinding-Eigenschaft, um anzugeben, welche Eigenschaft die untergeordneten Elemente einer Gruppe enthält? Dies würde es ermöglichen, eine untergeordnete Sammlungseigenschaft einzubetten, anstatt Gruppen zu zwingen, von einer Sammlung zu erben .

Vorteile:

  • Möglichkeit, die gruppierte Sammlung zu/von JSON zu (de)serialisieren.
    Das Vererben von Gruppen aus einer Sammlung blockiert die JSON-(De)Serialisierung (da JSON-Arrays nur einen Wertebereich und keine Eigenschaften unterstützen). Das (De-)Serialisieren von Ansichtsmodellen ist erforderlich, um den Ansichtsmodellstatus beizubehalten, wenn die App in den Hintergrund wechselt oder wenn Ihre App-API Ihnen Ansichtsmodelle sendet. Die aktuelle Problemumgehung besteht darin, eine zweite Datenstruktur zu verwenden und bei jeder Datenaktualisierung eine kostspielige Duplizierung + Transformation durchzuführen.
  • Möglichkeit, Ihre eigene Basisklasse für Gruppenelemente zu verwenden (zB ViewModelBase )
  • Vermeiden Sie die Verschmutzung von Gruppenobjekten mit allen geerbten Eigenschaften einer Sammlung

Sie könnten beispielsweise dieses
```C#
öffentliche Klasse PageTypeGroup : Liste
{
öffentlicher String Title { get; einstellen; }
// Weitere Eigenschaften ...
}

like this instead:

```C#
public class PageTypeGroup
{
    public string Title { get; set; }
    // More properties ...

    public List<PageModel> Children { get; set; }
}

mit XAML:

C# <CollectionView GroupItemsBinding = "{Binding Children}" ...> </CollectionView>

Das Nichtangeben von GroupItemsBinding wäre mit der vorhandenen Implementierung kompatibel, was GroupItemsBinding="{Binding .}"

PS Ich habe diesen Vorschlag bereits im Juli 2018 eingereicht.

Update 23. August 2019: Gruppierung wurde implementiert, jedoch ohne diesen Fix; siehe Gruppendaten

Ich hoffe, es ist nicht zu spät, dies hinzuzufügen.

Wie wäre es mit der Unterstützung mehrerer Gruppierungsebenen?
Würde es ermöglichen, Bäume anzuzeigen.

ZB Flutter hat ExpansionTile ( Beispiel )

In Bezug auf CollectionView bin ich auf ein Problem gestoßen, das meiner Meinung nach eine großartige Funktion wäre.

In einer horizontalen Liste fügen Sie mit Scrollen, normalerweise Designer, einen "Schatten"-Effekt auf die Elemente hinzu, die auf dem Bildschirm nicht vollständig sichtbar sind. Derzeit gibt es (soweit ich weiß) keine Möglichkeit, dies in xamarin.Forms zu tun. Würden Sie nicht denken, dass dies eine Nichte wäre, um ein Feature zu haben? Es könnte ein einfacher boolescher Wert sein, der beispielsweise einen "Schlagschatten" auf das Element anwendet, das nur durch einen X-Prozentsatz sichtbar ist.

Ich schlage eine Position-Eigenschaft vor. Diese Eigenschaft würde den Index des aktuellen Elements enthalten. Dies würde eine einfache Integration von ViewPagerIndicator und ähnlichen Indikatoren ermöglichen.

Ich verstehe, dass es schwierig sein kann, den "aktuellen Artikel" zu bestimmen. Wenn die Ausrichtung aktiviert ist, sollte es ziemlich einfach sein zu bestimmen, an welchem ​​Element die Ansicht ausgerichtet ist. Ohne Fangen würde die richtige Wahl vom Anwendungsfall abhängen: Vielleicht wäre es das Element, das den Anfangs- oder Mittelpunkt der Ansicht einnimmt.

Diese Eigenschaft könnte als Alternative zu ScrollTo() auch einen einfachen bidirektionalen Zugriff ermöglichen.

@hartez Wir haben erwartet, dass dies für die Version 4.0 bereit ist, aber überrascht, dass es noch nicht fertig ist. Wir können CollectionView nicht ohne Scroll- und Aktualisierungsfunktionen testen. Können Sie uns sagen, wie viele Sprints wir warten müssen, bevor sie eingeführt werden? Wir haben uns entschieden, in Zukunft nichts mehr mit ListView auszuliefern und möchten, dass dieses Steuerelement so schnell wie möglich verfügbar ist.

@hartez Wir brauchen eine Möglichkeit für CollectionView mit Elementinhalts anzupassen . Ich denke, es ist ein häufiger Anwendungsfall:
image
In diesem Beispiel sollten sich Schaltflächen direkt unter der Sammlungsansicht befinden. Ich denke, es sollte so funktionieren, wenn VerticalOptions Start ist

wenn der Schwellenwert für verbleibende Artikel erreicht wurde Eigenschaftstest

Ich habe Fragen dazu, ob der CollectionView-Fluss eines einzelnen Elementverhaltens das Verhalten von iOS Native nachahmt, wenn es um Änderungen der Bildschirmgröße geht. Ich gebe dir ein Beispiel:

Eine Bildergaleriezelle in iOS wird mit einer CollectionView erstellt und Sie definieren eine einzelne Zelle. Das Out-of-the-Box-Verhalten besteht darin, dass die Anzahl der Zellen, die in einer einzelnen Zeile gezeichnet werden, basierend auf der Bildschirmgröße dynamisch ist. Auf ein Telefon passen vielleicht 4 Artikel, aber auf ein Tablet passen vielleicht 8 oder 9.

Wird die Forms-Version dies auch bieten? Bisher habe ich in dem Beispiel, das ich gelesen habe, nur gesehen, wo Sie die GridItemsLayout Span-Eigenschaft festlegen. Dies führt zu einem hartcodierten Wert dafür, wie viele Elemente gezeichnet werden können, und in der Welt der verschiedenen Bildschirmgrößen scheint die harte Codierung 2014 so zu sein. :-P

UWP haben vier Auswahlmodusstatus
{
Keiner,
Single
Mehrere,
Erweitern,
}
image

image

Ich denke, vier Zustände in Android und IOS sind auch nützlich
Schauen Sie einfach in den Datei-Explorer
image

Gibt es Pläne für eine einfache Polsterimmobilie? #6605 Für meinen speziellen Anwendungsfall könnte ich wahrscheinlich eine leere Kopf- und Fußzeile in entsprechender Größe verwenden (sobald diese Funktionen entwickelt wurden), aber das wäre ein bisschen ein Hack und nicht für ein Rasterlayout geeignet, bei dem das Auffüllen auf allen vier Seiten möglich ist erforderlich sein.

Jeder Plan, Listenelemente in der Sammlungsansicht neu anzuordnen.

Behandelt die Spezifikation, wie die Auswahl für bestimmte Elemente in CollectionView deaktiviert wird?

// Any possible API could be helpful
private void OnSelectionChanging(object sender, SelectionChangingEventArgs e)
{
  if (...)
      e.Cancel = true;
 }

Derzeit bearbeite ich es, aber dies verhindert nicht, dass der ausgewählte VisualState angewendet wird.

void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // Deselect the item.
    if (sender is CollectionView cv && e.CurrentSelection...)
    {
        cv.SelectedItem = null;
    }
}

Vertikale Scrollbar-Farbe und horizontale ScrollBar-Farbe wäre großartig!

Was ist mit der Scrollrichtung, ich meine damit, von rechts nach links zu scrollen, nicht den Inhalt selbst?

Ich hätte gerne Trennzeichen...

Es wäre großartig, die Möglichkeit zu haben, sich die Bildlaufposition zu merken und anzuwenden.

Was so toll wäre, wäre eine Möglichkeit, für jeden zweiten oder X-Artikel unterschiedliche Artikelvorlagen zu verwenden. Damit wäre es möglich, für jeden zweiten Artikel einen grauen Hintergrund und viele weitere Styling-Möglichkeiten zu erstellen.

Kannst du das nicht schon mit der Vorlagenauswahl machen? Position mit verwenden
Modulo-Operator?

Am Dienstag, den 13. August 2019, 16:53 Uhr schrieb Legacyorder [email protected] :

Was so toll wäre, wäre eine Möglichkeit, verschiedene Gegenstände zu verwenden
Vorlagen für jedes zweite oder X-Element. Dies würde es ermöglichen, zu erstellen
ein grauer Hintergrund für jeden zweiten Artikel und viele andere Stylings
Möglichkeiten.


Sie erhalten dies, weil Sie diesen Thread abonniert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/xamarin/Xamarin.Forms/issues/3172?email_source=notifications&email_token=AC4YCKDFCH3WFENRCLPWEC3QELDE3A5CNFSM4FHJRXPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBWLO3LNMVXHJKT5issue
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AC4YCKHXX5YSR7M3S4VU5QLQELDE3ANCNFSM4FHJRXPA
.

Circular Scrolling wäre schön. Ich denke, es ist einfach zu implementieren.

Ich hätte gerne ein "AbsoluteItemsLayout" als ItemsLayout für die CollectionView um absolute Positionen in einer Liste setzen zu können, sehe ich im Moment keine andere Lösung als dies im Code Behind zu tun.

Ist es bei Verwendung von GridItemsLayout möglich, zuzulassen, dass sich Elemente über mehrere Zeilen oder Spalten erstrecken? Das wäre definitiv eine Funktion, die es wert wäre, sie zu haben.

Können Sie das Scrolled-Ereignis auch diesem Steuerelement aussetzen? Der Zweck ist, wenn ich das Ende der Liste erreiche, möchte ich zusätzliche Elemente neu laden. Ich weiß nicht, ob CollectionView erkennt, ob es sich im ScrollView befindet und die Scrollfunktion deaktiviert.

Können Sie das Scrolled-Ereignis auch diesem Steuerelement aussetzen? Der Zweck ist, wenn ich das Ende der Liste erreiche, möchte ich zusätzliche Elemente neu laden. Ich weiß nicht, ob CollectionView erkennt, ob es sich im ScrollView befindet und die Scrollfunktion deaktiviert.

Ihr Wunsch ist gewährt! Überprüfen Sie die Version 4.2 :)
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/collectionview/scrolling

Sie sollten eine CollectionView nicht in eine ScrollView einschließen, da sonst die Virtualisierung nicht funktioniert.

Können Sie das Scrolled-Ereignis auch diesem Steuerelement aussetzen? Der Zweck ist, wenn ich das Ende der Liste erreiche, möchte ich zusätzliche Elemente neu laden. Ich weiß nicht, ob CollectionView erkennt, ob es sich im ScrollView befindet und die Scrollfunktion deaktiviert.

Ihr Wunsch ist gewährt! Überprüfen Sie die Version 4.2 :)
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/collectionview/scrolling

Sie sollten eine CollectionView nicht in eine ScrollView einschließen, da sonst die Virtualisierung nicht funktioniert.

Ich bin in 4.2.0.709249
vermisse ich etwas?
image

image

Ich habe das Scrolled-Ereignis mit 4.2.0.709249.
Versuchen Sie, bin/obj-Ordner zu löschen, und überprüfen Sie die NuGet-Konsolidierung, um sicherzugehen.

Bekommen wir bald RTL-Support mit 4.2 für Android und iOS?

Bekommen wir bald RTL-Support mit 4.2 für Android und iOS?

Einige Unterstützung ist bereits da; Die FlowDirection-Unterstützung sollte bereits in CollectionView-Elementen funktionieren. Was noch unvollständig ist, ist die Scrollrichtung für horizontale CollectionView-Layouts. Die Scrollrichtung sollte der FlowDirection auf Android entsprechen, aber für die anderen Plattformen müssen wir noch etwas daran arbeiten. diese Arbeit soll in 4.3 abgeschlossen werden.

Wenn Sie bei der Verwendung von FlowDirection mit CollectionView auf Fehler stoßen, öffnen Sie bitte ein Problem und wir sehen uns das an.

Können Sie bitte beschreiben, was mit RTL-Unterstützung nicht gemacht wird?
Denn in der Spezifikation ist es nicht einmal als in Bearbeitung oder abgeschlossen markiert.

Am Do, 5. September 2019, 02:19 Uhr schrieb EZ Hart, [email protected] :

Bekommen wir bald RTL-Support mit 4.2 für Android und iOS?

Einige Unterstützung ist bereits da; FlowDirection-Unterstützung sollte bereits sein
Arbeiten innerhalb von CollectionView-Elementen. Was noch unvollständig ist, ist die Schriftrolle
Richtung für horizontale CollectionView-Layouts. Die Scrollrichtung
sollte mit FlowDirection auf Android übereinstimmen, aber wir haben noch etwas zu tun
tun Sie das für die anderen Plattformen.

Wenn Sie bei der Verwendung von FlowDirection mit CollectionView auf Fehler stoßen,
Bitte öffne ein Problem und wir schauen uns das an.


Sie erhalten dies, weil Sie einen Kommentar abgegeben haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/xamarin/Xamarin.Forms/issues/3172?email_source=notifications&email_token=ACDWB3GSYAQSADERHWVTJX3QIANMNA5CNFSM4FHJRXPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVX2HJKT58DN5MVXZHJKT54
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/ACDWB3HMFCHBRZWD5AJMXH3QIANMNANCNFSM4FHJRXPA
.

Nicht erledigt: Scrollrichtung für horizontale Layouts.

Wenn Sie FlowDirection = RightToLeft für eine horizontal scrollende CollectionView festlegen, ist die Scrollrichtung auf iOS und UWP derzeit nicht von rechts nach links (ich glaube, es funktioniert _funktioniert_ auf Android).

Wie wäre es mit ein paar LoadingDataTemplate?

Nach meiner Erfahrung beim asynchronen Laden von Daten in ListView/CollectionView kann es manchmal leer sein, bis die Listview/CollectionView gefüllt ist.

Das Hinzufügen von LoadingDataTemplate kann zusätzliche Reaktionsfähigkeit bieten, wenn große Datenmengen gefüllt werden und die Seite bereits angezeigt wurde.

Ich denke, es gibt zwei Möglichkeiten, einen Ladeindikator zu verwenden. Einer ist, wenn CollectionView anfänglich angezeigt wird. Es werden mehrere Platzhalterzellen angezeigt, bis die Daten der Sammlung ItemsSource hinzugefügt werden. Die zweite ist, wenn am Ende der Liste weitere Daten hinzugefügt werden. Für den zweiten, denke ich, können wir die Fußzeile nutzen?

Der erste erfordert mehr Arbeit (zB laden Sie die Quelle zunächst mit 3-5 Elementen, die dieselbe Platzhalterdatenvorlage haben, und entfernen Sie dann diese Elemente und fügen Sie die tatsächlichen Daten hinzu, wenn sie abgerufen werden). Ein anderer Ansatz besteht darin, eine Skelettansicht über CollectionView und sie auszublenden, wenn die Daten bereit sind. Ich verfolge diesen Ansatz derzeit mit ListView .

Ich habe dies nicht versucht, aber wir könnten zuerst EmptyView auf die Ladeansicht setzen und wenn es keine Ergebnisse gibt, ändern Sie die Vorlage für EmptyView , um eine "Nichts gefunden"-Meldung anzuzeigen.

@adrianknight89

Ein anderer Ansatz besteht darin, eine Skelettansicht über CollectionView und sie auszublenden, wenn die Daten bereit sind. Diesen Ansatz verfolge ich derzeit mit ListView .

Dies klingt nach der gleichen Methode, die ich auch befolge, dh oben einen Aktivitätsindikator setzen. Setzen Sie ListView auf IsVisible = false und ActivityIndicator IsVisible = true, und invertieren Sie dann beide Werte, nachdem Listview aufgefüllt wurde.

@adrianknight89

Ich habe dies nicht versucht, aber wir könnten zuerst EmptyView auf die Ladeansicht setzen und wenn keine Ergebnisse vorliegen, ändern Sie die Vorlage für EmptyView, um eine "Nichts gefunden"-Meldung anzuzeigen.

Da ist eine Idee! Das könnte zwar funktionieren, aber ich denke, es wäre besser, separate Vorlageneigenschaften in CollectionView bezüglich LoadingDataTemplate und EmptyView zu haben.

Ich stimme zu, dass es besser wäre, zwei verschiedene Eigenschaften zu haben. Abgesehen vom Aspekt der Einfachheit macht die Verwendung einer einzigen Eigenschaft für zwei verschiedene Zwecke nicht viel Sinn. Vielleicht hätte EmptyView BackgroundView heißen sollen, damit wir es für jeden Zweck verwenden können. (Bearbeiten: Ein BackgroundView ist eine ganz andere Sache.)

@LeoJHarris Ich habe #7447 für BackgroundView Unterstützung hinzugefügt. Wir könnten EmptyView und BackgroundView , um die beiden oben genannten Szenarien zu unterstützen, obwohl dies immer noch nicht zu 100% das ist, was Sie wollen, aber es sollte besser sein, als EmptyView zu verwenden, um beide zu unterstützen Szenarien. Sie könnten BackgroundView als Ladebildschirm verwenden und ihn auf Null setzen, wenn die Daten bereit sind.

@adrianknight89 Es wäre großartig, wenn CollectionView das "Null-Aus" behandeln würde, sobald die Daten fertig sind, anstatt dies manuell zu steuern (es sei denn, Sie implizieren dies bereits).

Beim schnellen Scrollen durch eine Seite, die den RemainingItemsThreshold von CollectionView verwendet, treten zwei verschiedene Probleme auf.

  1. Die App friert ein und muss erzwungen werden
  2. Die Elemente im CollectionView-Stapel übereinander (siehe Bild )

Habe noch niemanden gefunden der dieses Problem hat. Hast du es gemeldet gesehen?

@ Bronson15 Wie RemainingItemsThresholdReached ? Durch schnelles Scrollen wird es mehrmals ausgelöst. Daher müssen Sie Ereignisaufrufe ignorieren, während Sie darauf warten, Ihre Datenquelle zu aktualisieren, da sie sich sonst anhäufen. Versuchen Sie außerdem, Ihre Benutzeroberfläche im Hauptthread zu aktualisieren.

Wenn weiterhin Probleme auftreten, können Sie ein neues Problem mit einem Repro zur Untersuchung eröffnen.

@ Bronson15 beide Probleme.
Mit ObservableRangeCollection versucht und #2 behoben.
Immer noch Probleme mit Einfrierungen / leeren Listen: Wenn ich auf dem Emulator laufe, sehe ich CPU-Spitze, scheint eine Endlosschleife zu sein.

Edit: bricht nur auf iOS, auf Android funktioniert einwandfrei.

Hallo Team,
Sogar ich habe versucht, RemainingItemsThreshold und RemainingItemsThresholdReachedCommand zu verwenden, und habe festgestellt, dass die RemainingItemsThresholdReachedCommand zugewiesene Funktion mehrmals nacheinander aufgerufen wird (das erste Mal wird es zweimal aufgerufen, das nächste Mal 4 Mal usw.), auch wenn ich nicht schnell scrolle. Ich kann es auch mit einem neuen Xamarin Forms-Projekt (v.4.2.0.778463) reproduzieren.
Können Sie versuchen, es an Ihrem Ende zu reproduzieren? Hier ist das einfache Code-Snippet unten:

XAML:

<CollectionView
        x:Name="StackLayout"
        ItemsSource="{Binding LatestStories}"
        RemainingItemsThreshold="10"
        RemainingItemsThresholdReachedCommand="{Binding RemainingStoriesCommand}">
        <CollectionView.ItemTemplate>
            <DataTemplate>
            <Grid
                                ColumnSpacing="16"
                                HeightRequest="110"
                                RowSpacing="0">

                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*">
                        </ColumnDefinition>
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>

                    <!--  Blog title  -->
                    <Label
                                    Grid.Column="1"
                                    Margin="0,8"
                                    FontSize="14"
                                    LineBreakMode="TailTruncation"
                                    LineHeight="{OnPlatform Default=-1,
                                                            Android=1.25,
                                                            iOS=1.25}"
                                    MaxLines="2"
                                    Text="{Binding Title}" />

                    <!--  Author name  -->
                    <Label
                                    Grid.Row="1"
                                    Grid.Column="1"
                                    Margin="0,8,0,0"
                                    FontSize="12"
                                    LineHeight="{OnPlatform Default=-1,
                                                            Android=1.5}"
                                    Text="{Binding Author}" />

                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
</CollectionView>

Modell anzeigen:

public class ArticleListViewModel
    {
        public ObservableRangeCollection<FeedItem> LatestStories { get; } = new ObservableRangeCollection<FeedItem>();
        public Command RemainingStoriesCommand => new Command(() => RemainingStories());

        public ArticleListViewModel()
        {
            RemainingStories();
        }

        private async void RemainingStories()
        {
            var feeds = await GetRemoteFeedsAsync();
            try
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    LatestStories.AddRange(feeds);
                });

            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex, "");
            }
        }

        private async Task<List<FeedItem>> GetRemoteFeedsAsync()
        {
            try
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();
                var allItems = new List<FeedItem>();
                HttpResponseMessage response;
                var httpClient = new HttpClient();
                response = await httpClient.GetAsync("https://jsonplaceholder.typicode.com/photos").ConfigureAwait(false);
                if (response.IsSuccessStatusCode)
                {
                    var data = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                    var testData = JsonConvert.DeserializeObject<List<TestJson>>(data);
                    if (LatestStories.Count == 0)
                    {
                        testData = testData.Take(20).ToList();
                    }
                    else
                    {
                        testData = testData.Skip(LatestStories.Count).Take(20).ToList();
                    }

                    foreach (var item in testData)
                    {
                        var newItem = new FeedItem
                        {
                            Title = item.id.ToString(),
                            Description = item.title,
                            ImagePath = item.thumbnailUrl,
                            Link = item.url,
                            PublishDate = "2019-09-11",
                            Category = ""
                        };
                        allItems.Add(newItem);
                    }
                }
                watch.Stop();
                Debug.WriteLine("TPL Total Time: " + watch.ElapsedMilliseconds);
                return allItems;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex, "");
                throw;
            }

        }
    }

@Bronson15 @andreabalducci @techduggu Da wir die Benutzeroberfläche nicht blockieren, während RemainingItemsThresholdReachedCommand verarbeitet wird, ist es normal, dass Sie den Befehl aufgrund Ihrer Scrollmuster mehrmals drücken . Bitte sehen Sie, wie ich das Problem mit einem Sperrmechanismus handhabe: https://github.com/xamarin/Xamarin.Forms/pull/7516/files#diff -2be3eff4d53f761cd581cca1d2ec3bc0R48

Andere Möglichkeiten, dies zu tun, besteht darin, Ihren Befehl zu aktivieren/deaktivieren oder das Ereignis abzubestellen/zu abonnieren, während der Remote-Abruf ausgeführt wird. Nach meiner Erfahrung funktionierte ein Semaphor am besten, da manchmal mehrere Aufrufe ausgelöst werden, wenn Sie versuchen, den Rückruf zu aktivieren/deaktivieren oder abzubestellen/abzubestellen.

@hartez @samhouts @davidortinau Ich denke, dieses Thema wird in Zukunft ziemlich oft auftauchen. Sollte der obige Vorschlag Teil der Dokumentation für verbleibende Elemente sein? Ich würde das Docs-Team bitten, einen Remote-Feed zum Testen zu erstellen und ein Codierungsmuster als Referenz zu empfehlen, damit die Leute nicht ständig um Hilfe bitten.

@techduggu Es gibt verschiedene (kleinere) Probleme mit Ihrem Code. Ich würde den Code auf Stack Exchange überprüfen lassen. Das ist jetzt nicht der richtige Ort dafür.

@adrianknight89 Vielen Dank, dass Sie den Begriff "aufgrund Ihrer
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnScrollListener

Ihr Code und diese Android-Anleitung (https://github.com/codepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews-and-RecyclerView) bestätigen auch, dass wir unendliches Scrollen entweder durch Sperren oder durch Verwendung behandeln sollten der oben genannten Scroll-Zustände (was meistens einen benutzerdefinierten Renderer erfordert). Daher habe ich Ihren Code mit Xamarin.Forms ausprobiert und er hat wie ein Zauber funktioniert. :) Ich würde empfehlen und Ihre Meinung unterstützen, diesen Vorschlag als Teil der Dokumentation aufzunehmen, um solche Probleme zu vermeiden, die von Leuten (mit Halbwissen) wie mir aufgeworfen werden. :)

Auch reg. die kleineren Probleme, die Sie für das obige Code-Snippet erwähnt haben - Nun, dies ist nur ein POC-Projekt zum Testen des unendlichen Ladens mit Collection View, aber ich würde gerne Ihre Eingaben wissen, wenn Sie etwas anderes als dumme Nullprüfung usw. bemerkt haben.

Danke!

@adrianknight89 Ah ja. Unser Busy-Check fehlte und das half bei dem Stapelproblem.

Ich habe auch das Semaphore implementiert, wie Sie es vorgeschlagen haben, und es scheint ein Problem behoben zu haben, bei dem beim Hinzufügen neuer Elemente zur ItemsSource die Ansicht die Bildlaufposition auf den Anfang zurückgesetzt hat. Seltsamerweise füge ich den Anruf bei einem Versuch hinzu; endlich; wie Sie es in Ihrer Testdatei getan haben, brachte dieses Problem zurück.

Es besteht immer noch ein Problem mit dem Einfrieren beim Scrollen zum Ende der Liste. Die Ansicht wird leer und die Anwendung friert ein.

Edit: Scroll Position Reset ist immer noch da, aber nicht so oft. Das Rendering beim Laden weiterer Elemente ist auf dem Gerät ebenfalls sehr abgehackt.

@techduggu Ich habe kein VS bei mir, aber wenn Sie sich nur den Code RemainingStories() warten, den Remote-Aufruf in den Try verschieben und ein using für HttpClient (idealerweise verwenden Sie eine einzelne statische Instanz in Ihrer Anwendung und verwerfen Sie sie nie), aber ich höre hier auf. :)

@ Bronson15 Es gab ein Problem mit CollectionView, das die Scroll-Position zurückgesetzt und das Einfrieren der Benutzeroberfläche verursacht hat. Ich denke, es wurde mit #7285 behoben, aber das ist nur iOS. Können Sie das neueste nächtliche Nuget testen und sehen, ob Sie immer noch Probleme haben? Die URL des nächtlichen Feeds befindet sich auf der GitHub-Startseite für Formulare. Wenn die Probleme weiterhin bestehen, öffnen Sie bitte ein Problem mit dem Reproduktionscode, damit wir uns das ansehen können.

@adrianknight89 Durch den nächtlichen Build

@ Bronson15 Endlosschleife sollte nicht passieren. Sehen Sie es auf iOS oder Android? Sie müssen die Schleife beenden, wenn Sie das Ende Ihres Remote-Feeds erreichen (dh sofort von RemainingItemsThresholdReachedCommand ohne einen weiteren DB-Aufruf abzusetzen).

Sobald das Scrollen der Ansicht stoppt, sollte der Befehl nicht mehr ausgelöst werden. Ich verwende Azure Cosmos, das ein Fortsetzungstoken zurückgibt. Wenn das Token null ist, weiß ich, dass kein Inhalt mehr geladen werden muss, also funktioniert mein RemainingItemsThresholdReachedCommand basierend auf diesem Token. Sie sollten etwas Ähnliches implementieren.

@adrianknight89 Ahhh. Interessant. Es wurde eine Überprüfung auf die Ergebnisanzahl und die Rückgabe hinzugefügt, wenn sie 0 ist. Das unendliche Scrollen wurde behoben. Danke für die Hilfe!

@adrianknight89 wurde fast auf iOS-
mit 1000 Elementen auf Android ist fast Echtzeit, auf iOS müssen Sie 5-7 Sekunden warten, bis die Ansicht gerendert wird. beide Debug, iPhone Xs und Redmi Note 7

@andreabalducci Bist du im XS-Simulator? Wie ist das Verhalten auf einem physischen Gerät? Wenn das Rendern der Ansicht langsam ist, kann dies ein weiteres Problem mit iOS sein, das untersucht werden muss. Auch hier wäre es toll, eine Repro zu sehen.

@adrianknight89 @andreabalducci Ja, es dauert ungefähr 1-5 Sekunden auf meinem Xs Max, um mehr Elemente zu laden. Die Ansicht blendet alle Elemente aus und lädt sie neu, anstatt Elemente zur bereits gerenderten Liste hinzuzufügen.

@adrianknight89 Beide physischen Geräte, der iOS-Emulator, haben die gleichen Probleme.

Wir haben das gesamte Stacklayout aus den Datenvorlagen entfernt und die Geschwindigkeit beim Wechsel zu FormattedString erhöht, kompilierte Bindungen aktiviert, bevor iOS über 20 Sekunden war.

Auf iOS wird die Ansicht schwarz und alles neu gezeichnet, wenn die ObservableRangeCollection (von mvvm-Helfern) hinzugefügt wird, auf Android funktioniert es einwandfrei.

Das klingt für mich nach einem separaten Thema. Ich glaube nicht, dass es an den restlichen Artikeln liegt.

Ist es bei Verwendung von GridItemsLayout möglich, zuzulassen, dass sich Elemente über mehrere Zeilen oder Spalten erstrecken? Das wäre definitiv eine Funktion, die es wert wäre, sie zu haben.

Irgendwelche Informationen dazu?

@LynoDesu Dafür wird ein Problem verfolgt: https://github.com/xamarin/Xamarin.Forms/issues/6357

@LynoDesu Hierfür wird ein Problem verfolgt: #6357

Ah gut! Danke. Wo fange ich an, wenn ich dazu beitragen möchte?

Lesen Sie das Homepage-Wiki sowie Contributing.md .

@adrianknight89 hat das leere + Zurück zum Startproblem gefunden, Repro hier https://github.com/andreabalducci/XamarinCollectionView/blob/b186e563ff8391dfb473e62e5a4c4587e8d4e9da/cvrepro/cvrepro/ListViewModel.cs#L46

Das Starten mit einer leeren Sammlung löst das Problem aus, wenn die Sammlung Elemente enthält, bevor alle Funktionen wie erwartet gebunden werden.

auf dem iPhone-Emulator getestet.

Ich sehe das Problem. Dies ist wahrscheinlich das gleiche wie #7548. Vielleicht möchten Sie Ihre Repro dort posten.

CollectionView scheint unter Android fehlerhaft zu sein, wenn IsGrouped verwendet wird.

CollectionView.GroupHeaderTemplate wird überhaupt nicht gerendert. Auf iOS funktioniert es gut. Sie können einfach das Gruppierungsbeispiel von der Microsoft-Site verwenden, um es zu testen.

    public class AnimalGroup : List<Animal>
    {
        public string Name { get; private set; }

        public AnimalGroup(string name, List<Animal> animals) : base(animals)
        {
            Name = name;
        }
    }

    public class Animal
    {
        public string Name { get; set; }
        public string Location { get; set; }
        public string Details { get; set; }
        public string ImageUrl { get; set; }
    }

    public List<AnimalGroup> Animals { get; private set; } = new List<AnimalGroup>();

    Animals.Add(new AnimalGroup("Bears", new List<Animal>
        {
            new Animal
            {
                Name = "American Black Bear",
                Location = "North America",
                Details = "Details about the bear go here.",
                ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/0/08/01_Schwarzbär.jpg"
            },
            new Animal
            {
                Name = "Asian Black Bear",
                Location = "Asia",
                Details = "Details about the bear go here.",
                ImageUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Ursus_thibetanus_3_%28Wroclaw_zoo%29.JPG/180px-Ursus_thibetanus_3_%28Wroclaw_zoo%29.JPG"
            },
        }));
<CollectionView ItemsSource="{Binding Animals}"
                        IsGrouped="true">
            <CollectionView.GroupHeaderTemplate>
                <DataTemplate>
                    <Label Text="Header"
                           BackgroundColor="LightGray"
                           FontSize="Large"
                           FontAttributes="Bold" />
                </DataTemplate>
            </CollectionView.GroupHeaderTemplate>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid Padding="10">
                        <Image Grid.RowSpan="2"
                               Source="{Binding ImageUrl}"
                               Aspect="AspectFill"
                               HeightRequest="60"
                               WidthRequest="60" />
                        <Label Grid.Column="1"
                               Text="{Binding Name}"
                               FontAttributes="Bold" />
                        <Label Grid.Row="1"
                               Grid.Column="1"
                               Text="Child"
                               FontAttributes="Italic"
                               VerticalOptions="End" />
                    </Grid>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/collectionview/grouping

Wichtig

Das Gruppieren von Daten mit CollectionView wird derzeit nur unter iOS unterstützt.

Ops, ich habe diesen Teil verpasst. Danke.

Für diejenigen von uns, die eine gruppierte Liste sowohl auf iOS als auch auf Android anzeigen möchten, aber ListView vermeiden möchten, gibt es noch etwas anderes, das wir verwenden können, das derzeit so flexibel ist wie CollectionView? Oder stecken wir bei ListView fest?

Ich hoffe, das ist der richtige Ort, um zu fragen. Ich sehe in der ursprünglich veröffentlichten Spezifikation, dass es Eigenschaften für IsHeaderSticky und IsFooterSticky , aber ich sehe sie nirgendwo in der Diskussion oder im implementierten Quellcode weiter. Sind diese noch auf der Roadmap für diese Ansicht?

In der Sammlungsansicht benötigen wir ItemAppeared, ITemDisappeared.
gibt es eine Möglichkeit zu erreichen?

@IosDeveloperHarsh Das Scrolled Ereignis bietet viele nützliche Informationen in den Ereignisargumenten. Sehen Sie sich dort den ersten und den letzten sichtbaren Artikelindex an.

@rafiwardak2003 Gallery-Beispiele mit CollectionView-Gruppen funktionieren ab heute auf Android, obwohl ich das von Ihnen bereitgestellte Beispiel nicht ausgeführt habe. Welches Nuget hast du benutzt? Probieren Sie es mit der neuesten Vorabversion oder Nightly aus.

@cabal95 Ich bin nicht qualifiziert, dies zu beantworten, aber wenn ich raten

Ich denke, dass SelectionChangedCommandParameter entfernt werden sollte und stattdessen das ausgewählte Element automatisch als Parameter festgelegt wird.

Wenn es möglich ist, wäre es schön, die Immobilie so zu nutzen

public ICommand => new Command<MySelectedItemModel>((item) => {}

Aber das sollte auch ok sein:

public ICommand => new Command<object>((item) =>{ var selectedItem = item as MySelectedItemModel;}

Ich denke, dass SelectionChangedCommandParameter entfernt werden sollte und stattdessen das ausgewählte Element automatisch als Parameter festgelegt wird.

Wenn es möglich ist, wäre es schön, die Immobilie so zu nutzen

public ICommand => new Command<MySelectedItemModel>((item) => {}

Aber das sollte auch ok sein:

public ICommand => new Command<object>((item) =>{ var selectedItem = item as MySelectedItemModel;}

Was ist, wenn der Benutzer etwas anderes als das SelectedItem als Parameter für seinen Befehl verwenden möchte?

Ich denke, dass SelectionChangedCommandParameter entfernt werden sollte und stattdessen das ausgewählte Element automatisch als Parameter festgelegt wird.
Wenn es möglich ist, wäre es schön, die Immobilie so zu nutzen
public ICommand => new Command<MySelectedItemModel>((item) => {}
Aber das sollte auch ok sein:
public ICommand => new Command<object>((item) =>{ var selectedItem = item as MySelectedItemModel;}

Was ist, wenn der Benutzer etwas anderes als das SelectedItem als Parameter für seinen Befehl verwenden möchte?

Sie haben Recht, aber ich kann kaum einen Anwendungsfall dafür sehen, da Sie den Parameter auf CollectionView-Ebene festlegen. Ich habe erwartet, dass es das ausgewählte Element ist, als ich es zum ersten Mal verwendet habe. Aber vielleicht können Sie das ausgewählte Element als Standard festlegen? Wenn Sie das Ereignis verwenden, erhalten Sie es, also denke ich, dass viele Entwickler es auch für den Befehl erwarten.

Ich möchte auch um eine Funktion bitten, dass sich diese CollectionView nicht über den gesamten Bildschirm erstreckt und nur die Höhe von der Anzahl der Elemente abhängt.

Ich versuche mehrere Listen im Blick zu haben
dh
Einkäufe

Abzüge

Gesamt
gesamt
Knirps

aber Items 1 und 2 (eine CollectionView) nahmen einfach zu viel Höhe in Anspruch, selbst wenn ich nur 3 oder 4 Items habe und unten eine BIIIIIIIIIIIIIIIG Lücke ist, bevor ich den Abschnitt Abzüge sehen kann

Am Ende habe ich mein eigenes ItemsCollection-Steuerelement basierend auf StackLayout erstellt

Ich möchte auch um eine Funktion bitten, dass sich diese CollectionView nicht über den gesamten Bildschirm erstreckt und nur die Höhe von der Anzahl der Elemente abhängt.
Am Ende habe ich mein eigenes ItemsCollection-Steuerelement basierend auf StackLayout erstellt

Ich denke, was Sie suchen, sind möglicherweise bindbare Layouts .

Ich möchte auch um eine Funktion bitten, dass sich diese CollectionView nicht über den gesamten Bildschirm erstreckt und nur die Höhe von der Anzahl der Elemente abhängt.
Am Ende habe ich mein eigenes ItemsCollection-Steuerelement basierend auf StackLayout erstellt

Ich denke, was Sie suchen, sind möglicherweise bindbare Layouts .

Hallo! Genau das was ich brauche. Seit wann gibt es BindableLayouts?

Vielen Dank an alle für die Diskussion zu diesem Thema! Wenn Sie zusätzliche Funktionsanfragen oder Fehlerberichte haben, öffnen Sie bitte jeweils neue Probleme. Wir schließen dieses Thema jetzt.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen