Zum Inhalt
Kuonen.UI

Ring, Abzeichen und Karten

Der Fortschrittsring zeigt bestimmt einen Bogen nach dem Wert, unbestimmt dreht er (mit „Bewegung reduzieren“ ruht er). Abzeichen sind ein Punkt, eine Zahl (über 99 „99+“) oder ein Symbol in der Farbe ihrer Dringlichkeit und hängen mit Badge.Inhalt an jedem Element. Karten tragen Kopf, Inhalt und Fuss mit Schatten nach ihrer Erhebung; eine anklickbare Karte reagiert auf Zeiger und Tastatur.

Vorführung: Ring, Abzeichen und KartenVorführung: Ring, Abzeichen und Karten

KXAML

RueckmeldungenSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            x:Class="Kuonen.UI.Galerie.Seiten.RueckmeldungenVorfuehrung"
            Spacing="16">
  <StackPanel Orientation="Horizontal" Spacing="12">
    <ProgressRing x:Name="Ring" IsIndeterminate="False" Value="60" />
    <CheckBox x:Name="Unbestimmt" Content="Unbestimmt" Click="Unbestimmt_Click" />
  </StackPanel>
  <StackPanel Orientation="Horizontal" Spacing="12">
    <InfoBadge />
    <InfoBadge Value="7" />
    <InfoBadge Value="120" Severity="Critical" />
    <InfoBadge Icon="{x:Static Symbole.Haken}" Severity="Success" />
    <InfoBadge Value="3" Severity="Caution" />
    <Button Content="Posteingang" Click="Post_Click">
      <Badge.Inhalt>
        <InfoBadge Value="1" />
      </Badge.Inhalt>
    </Button>
  </StackPanel>
  <StackPanel Orientation="Horizontal" Spacing="12">
    <Card Header="Welt „Insel“" Content="Zuletzt gespeichert" Footer="vor 2 Minuten" Width="180" />
    <Card Header="Neue Welt" Content="Klicken zum Anlegen" Elevation="3" IsClickable="True" Width="180" Click="Karte_Click" />
  </StackPanel>
  <TextBlock x:Name="Meldung" Text="Bereit." />
</StackPanel>
RueckmeldungenSeite.kxaml.cs
using Kuonen.UI;
using Kuonen.UI.Ereignisse;

namespace Kuonen.UI.Galerie.Seiten;

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

/// <summary>KXAML-Fassung der Seite Ring, Abzeichen und Karten: der Baum steht in RueckmeldungenSeite.kxaml, hier das Verhalten.</summary>
public sealed partial class RueckmeldungenVorfuehrung
{
    public RueckmeldungenVorfuehrung() => InitializeComponent();

    private void Unbestimmt_Click(object sender, RoutedEventArgs e) => Ring.IsIndeterminate = Unbestimmt.IsChecked == true;

    private void Post_Click(object sender, RoutedEventArgs e) => RueckmeldungenSeite.Erhoehe(sender);

    private void Karte_Click(object sender, RoutedEventArgs e) => Meldung.Text = "Karte geklickt.";
}

C#

RueckmeldungenSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: <see cref="ProgressRing"/>, <see cref="InfoBadge"/>, <see cref="Badge"/> und <see cref="Card"/>.</summary>
public sealed partial class RueckmeldungenSeite : GalerieSeite
{
    public override string Titel => "Ring, Abzeichen und Karten";

    public override string Beschreibung =>
        "Der Fortschrittsring zeigt bestimmt einen Bogen nach dem Wert, unbestimmt dreht er (mit „Bewegung reduzieren“ ruht er). Abzeichen sind ein Punkt, "
        + "eine Zahl (über 99 „99+“) oder ein Symbol in der Farbe ihrer Dringlichkeit und hängen mit Badge.Inhalt an jedem Element. Karten tragen Kopf, "
        + "Inhalt und Fuss mit Schatten nach ihrer Erhebung; eine anklickbare Karte reagiert auf Zeiger und Tastatur.";

    public override string Stichworte =>
        "ProgressRing Fortschrittsring Ladeanzeige unbestimmt InfoBadge Badge Abzeichen Zähler Punkt Card Karte Elevation Schatten IsClickable";

    public override string Datei => nameof(RueckmeldungenSeite);

    internal static void Erhoehe(object? sender)
    {
        if (sender is UIElement element && Badge.GetInhalt(element) is InfoBadge zahl) zahl.Value = zahl.Value < 0 ? 1 : zahl.Value * 2;
    }

    public override UIElement Baue()
    {
        var meldung = new TextBlock { Text = "Bereit." };
        var ring = new ProgressRing { IsIndeterminate = false, Value = 60 };
        var unbestimmt = new CheckBox { Content = "Unbestimmt" };
        unbestimmt.Click += (_, _) => ring.IsIndeterminate = unbestimmt.IsChecked == true;
        var ringe = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 12 };
        ringe.Children.Add(ring);
        ringe.Children.Add(unbestimmt);

        var abzeichen = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 12 };
        abzeichen.Children.Add(new InfoBadge());
        abzeichen.Children.Add(new InfoBadge { Value = 7 });
        abzeichen.Children.Add(new InfoBadge { Value = 120, Severity = InfoBadgeSeverity.Critical });
        abzeichen.Children.Add(new InfoBadge { Icon = Symbole.Haken, Severity = InfoBadgeSeverity.Success });
        abzeichen.Children.Add(new InfoBadge { Value = 3, Severity = InfoBadgeSeverity.Caution });
        var post = new Button { Content = "Posteingang" };
        Badge.SetInhalt(post, new InfoBadge { Value = 1 });
        post.Click += (s, _) => Erhoehe(s);
        abzeichen.Children.Add(post);

        var karten = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 12 };
        karten.Children.Add(new Card { Header = "Welt „Insel“", Content = "Zuletzt gespeichert", Footer = "vor 2 Minuten", Width = 180 });
        var klickbar = new Card { Header = "Neue Welt", Content = "Klicken zum Anlegen", Elevation = 3, IsClickable = true, Width = 180 };
        klickbar.Click += (_, _) => meldung.Text = "Karte geklickt.";
        karten.Children.Add(klickbar);

        var seite = new StackPanel { Spacing = 16 };
        seite.Children.Add(ringe);
        seite.Children.Add(abzeichen);
        seite.Children.Add(karten);
        seite.Children.Add(meldung);
        return seite;
    }
}