Zum Inhalt
Kuonen.UI

MAUI-Listen

CollectionView mit Auswahl und Nachladen, Zeilen mit Wischaktionen (SwipeView) und eine Einstellungstabelle (TableView) wie MAUI.

Vorführung: MAUI-ListenVorführung: MAUI-Listen

KXAML

MauiListenSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            x:Class="Kuonen.UI.Galerie.Seiten.MauiListenVorfuehrung"
            Spacing="8">
  <!-- Gefüllt von MauiListenSeite.Fuelle, derselben Methode wie die C#-Fassung. -->
  <StackPanel x:Name="Flaeche" Spacing="8" />
</StackPanel>
MauiListenSeite.kxaml.cs
using Kuonen.UI;

namespace Kuonen.UI.Galerie.Seiten;

public sealed partial class MauiListenSeite
{
    protected override Func<UIElement>? KxamlFabrik => () => new MauiListenVorfuehrung();
}

/// <summary>KXAML-Fassung der Seite: das Gerüst steht in MauiListenSeite.kxaml, das Innere füllt MauiListenSeite.Fuelle.</summary>
public sealed partial class MauiListenVorfuehrung
{
    public MauiListenVorfuehrung()
    {
        InitializeComponent();
        MauiListenSeite.Fuelle(Flaeche);
    }
}

C#

MauiListenSeite.cs
using System.Collections.ObjectModel;
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: CollectionView, SwipeView und TableView wie MAUI (Plan 6n).</summary>
public sealed partial class MauiListenSeite : GalerieSeite
{
    public override string Titel => "MAUI-Listen";

    public override string Beschreibung => "CollectionView mit Auswahl und Nachladen, Zeilen mit Wischaktionen (SwipeView) und eine Einstellungstabelle (TableView) wie MAUI.";

    public override string Stichworte => "MAUI Xamarin CollectionView SwipeView TableView TextCell SwitchCell EntryCell Wischen Liste Einstellungen";

    public override string Datei => nameof(MauiListenSeite);

    public override UIElement Baue()
    {
        // Wie die KXAML-Fassung: eine Wurzel mit der Fläche darin.
        var flaeche = new StackPanel { Spacing = 8 };
        Fuelle(flaeche);
        return new StackPanel { Spacing = 8, Children = { flaeche } };
    }

    /// <summary>Inhalt der Seite (auch von der KXAML-Fassung benutzt).</summary>
    public static void Fuelle(StackPanel flaeche)
    {
        var meldung = new TextBlock { Text = "Wische eine Zeile nach links oder rechts." };
        var aufgaben = new ObservableCollection<string>();
        for (int i = 1; i <= 12; i++) aufgaben.Add($"Aufgabe {i}");
        var liste = new CollectionView
        {
            ItemsSource = aufgaben,
            SelectionMode = ItemsSelectionMode.Single,
            Height = 220,
            RemainingItemsThreshold = 2,
            ItemTemplate = new DataTemplate(daten =>
            {
                var text = daten as string ?? "";
                var erledigt = new SwipeItem { Text = "Erledigt" };
                erledigt.Invoked += (_, _) => meldung.Text = text + " erledigt";
                var loeschen = new SwipeItem { Text = "Löschen" };
                loeschen.Invoked += (_, _) => aufgaben.Remove(text);
                return new SwipeView
                {
                    Content = new Border { Padding = new Thickness(12, 8, 12, 8), Child = new TextBlock { Text = text } },
                    LeftItems = new SwipeItems { Mode = SwipeMode.Execute, Items = { erledigt } },
                    RightItems = new SwipeItems { loeschen },
                };
            }),
        };
        liste.RemainingItemsThresholdReached += (_, _) =>
        {
            if (aufgaben.Count >= 40) return;
            int n = aufgaben.Count;
            for (int i = 1; i <= 6; i++) aufgaben.Add($"Aufgabe {n + i}");
        };
        flaeche.Children.Add(new TextBlock { Text = "CollectionView mit SwipeView (lädt beim Rollen nach)" });
        flaeche.Children.Add(new Border { BorderThickness = new Thickness(1), Child = liste });
        flaeche.Children.Add(meldung);

        var dunkel = new SwitchCell { Text = "Dunkles Design" };
        var name = new EntryCell { Label = "Name", Placeholder = "Vor- und Nachname" };
        var stand = new TextBlock();
        void Zeige() => stand.Text = $"Dunkel: {(dunkel.On ? "ja" : "nein")}, Name: {name.Text}";
        dunkel.OnChanged += (_, _) => Zeige();
        name.Completed += (_, _) => Zeige();
        var tabelle = new TableView
        {
            Intent = TableIntent.Settings,
            Height = 260,
            Root = new TableRoot("Einstellungen")
            {
                new TableSection("Darstellung") { dunkel, new TextCell { Text = "Sprache", Detail = "Deutsch" } },
                new TableSection("Konto") { name, new SwitchCell { Text = "Benachrichtigungen", On = true } },
            },
        };
        Zeige();
        flaeche.Children.Add(new TextBlock { Text = "TableView" });
        flaeche.Children.Add(new Border { BorderThickness = new Thickness(1), Child = tabelle });
        flaeche.Children.Add(stand);
    }
}