Zum Inhalt
Kuonen.UI

InfoBar und TeachingTip

InfoBar im Inhalt in vier Schweregraden mit Aktion und Kreuz; TeachingTip als Hinweiskarte an einem Knopf (oder ohne Ziel unten rechts), auf Wunsch leicht schliessbar.

Vorführung: InfoBar und TeachingTipVorführung: InfoBar und TeachingTip

KXAML

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

namespace Kuonen.UI.Galerie.Seiten;

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

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

C#

HinweiseSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;
using Kuonen.UI.Media;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: InfoBar und TeachingTip (Plan 6m).</summary>
public sealed partial class HinweiseSeite : GalerieSeite
{
    public override string Titel => "InfoBar und TeachingTip";

    public override string Beschreibung => "InfoBar im Inhalt in vier Schweregraden mit Aktion und Kreuz; TeachingTip als Hinweiskarte an einem Knopf (oder ohne Ziel unten rechts), auf Wunsch leicht schliessbar.";

    public override string Stichworte => "InfoBar InfoBarSeverity TeachingTip Hinweis Meldung WinUI";

    public override string Datei => nameof(HinweiseSeite);

    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 } };
    }

    private static Button Knopf(string text, Action tun)
    {
        var k = new Button { Content = text };
        k.Click += (_, _) => tun();
        return k;
    }

    private static StackPanel Zeile(params UIElement[] kinder)
    {
        var z = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 6 };
        foreach (var k in kinder) z.Children.Add(k);
        return z;
    }

    /// <summary>Inhalt der Seite (auch von der KXAML-Fassung benutzt).</summary>
    public static void Fuelle(StackPanel flaeche)
    {
        foreach (var (schwere, titel, text) in new[]
        {
            (InfoBarSeverity.Informational, "Hinweis", "Eine neue Fassung ist verfügbar."),
            (InfoBarSeverity.Success, "Gespeichert", "Alle Änderungen sind gesichert."),
            (InfoBarSeverity.Warning, "Achtung", "Die Verbindung ist langsam."),
            (InfoBarSeverity.Error, "Fehler", "Die Datei ist gesperrt."),
        })
        {
            var leiste = new InfoBar { Severity = schwere, Title = titel, Message = text, IsOpen = true, Width = 520, HorizontalAlignment = HorizontalAlignment.Left };
            if (schwere == InfoBarSeverity.Error) leiste.ActionButton = new Button { Content = "Wiederholen" };
            flaeche.Children.Add(leiste);
        }
        var ziel = new Button { Content = "Neues Dokument" };
        var tipp = new TeachingTip { Target = ziel, Title = "Neu hier?", Subtitle = "Damit legen Sie ein leeres Dokument an.", CloseButtonContent = "Verstanden", ActionButtonContent = "Mehr" };
        var frei = new TeachingTip { Title = "Tipp ohne Ziel", Subtitle = "Ein Klick daneben schliesst.", IsLightDismissEnabled = true };
        flaeche.Children.Add(Zeile(ziel, Knopf("Tipp zeigen", () => tipp.IsOpen = true), Knopf("Tipp ohne Ziel", () => frei.IsOpen = true), tipp, frei));
    }
}