Chip
Chips nach Material: Filter mit Mehrfachwahl, eine Grösse als Einzelwahl mit Pflicht (der letzte gewählte bleibt), Empfänger als Eingabe-Chips mit Schliesssymbol (Klick, Entf oder Rücktaste entfernt) und zwölf Themen in einer Zeile mit Bildlauf.


KXAML
ChipSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
xmlns:x="https://ui.kuonen.org/kxaml/x"
xmlns:local="using:Kuonen.UI.Galerie.Seiten"
x:Class="Kuonen.UI.Galerie.Seiten.ChipVorfuehrung"
Spacing="8">
<TextBlock Text="Filter (Mehrfachwahl)" FontWeight="SemiBold" />
<ChipGroup x:Name="Filter" ItemsSource="{x:Static local:ChipSeite.Filter}" SelectionMode="Multiple" SelectionChanged="Filter_SelectionChanged" />
<TextBlock Text="Grösse (Einzelwahl mit Pflicht)" FontWeight="SemiBold" />
<ChipGroup x:Name="Groesse" ItemsSource="{x:Static local:ChipSeite.Groessen}" IsSelectionRequired="True" SelectedIndex="1"
SelectionChanged="Groesse_SelectionChanged" />
<TextBlock Text="Empfänger" FontWeight="SemiBold" />
<WrapPanel>
<Chip Content="Anna" IsCloseIconVisible="True" Margin="0,0,8,8" CloseIconClick="Empfaenger_CloseIconClick" />
<Chip Content="Ben" IsCloseIconVisible="True" Margin="0,0,8,8" CloseIconClick="Empfaenger_CloseIconClick" />
<Chip Content="Cleo" IsCloseIconVisible="True" Margin="0,0,8,8" CloseIconClick="Empfaenger_CloseIconClick" />
</WrapPanel>
<TextBlock Text="Themen in einer Zeile" FontWeight="SemiBold" />
<ChipGroup x:Name="Themen" Width="300" HorizontalAlignment="Left" ItemsSource="{x:Static local:ChipSeite.Themen}" IsSingleLine="True"
SelectionChanged="Themen_SelectionChanged" />
<TextBlock x:Name="Meldung" Text="Bereit." />
</StackPanel>ChipSeite.kxaml.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Ereignisse;
namespace Kuonen.UI.Galerie.Seiten;
public sealed partial class ChipSeite
{
protected override Func<UIElement>? KxamlFabrik => () => new ChipVorfuehrung();
}
/// <summary>KXAML-Fassung der Chip-Seite: der Baum steht in ChipSeite.kxaml, hier das Verhalten.</summary>
public sealed partial class ChipVorfuehrung
{
public ChipVorfuehrung() => InitializeComponent();
private void Filter_SelectionChanged(object sender, SelectionChangedEventArgs e) => Meldung.Text = ChipSeite.Gewaehlt("Filter", Filter);
private void Groesse_SelectionChanged(object sender, SelectionChangedEventArgs e) => Meldung.Text = ChipSeite.Gewaehlt("Grösse", Groesse);
private void Themen_SelectionChanged(object sender, SelectionChangedEventArgs e) => Meldung.Text = ChipSeite.Gewaehlt("Thema", Themen);
private void Empfaenger_CloseIconClick(object? sender, RoutedEventArgs e) => Meldung.Text = ChipSeite.Entferne(sender);
}C#
ChipSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Ereignisse;
using Kuonen.UI.Layout;
namespace Kuonen.UI.Galerie.Seiten;
/// <summary>Galerie-Seite: <see cref="Chip"/> und <see cref="ChipGroup"/>.</summary>
public sealed partial class ChipSeite : GalerieSeite
{
public override string Titel => "Chip";
public override string Beschreibung =>
"Chips nach Material: Filter mit Mehrfachwahl, eine Grösse als Einzelwahl mit Pflicht (der letzte gewählte bleibt), Empfänger als Eingabe-Chips mit "
+ "Schliesssymbol (Klick, Entf oder Rücktaste entfernt) und zwölf Themen in einer Zeile mit Bildlauf.";
public override string Stichworte => "Chip Filter Etikett Tag Marke Auswahl Entfernen ChipGroup IsCheckable IsCloseIconVisible CloseIconClick IsSelectionRequired IsSingleLine";
public override string Datei => nameof(ChipSeite);
/// <summary>Die Einträge der Seite (im KXAML über x:Static).</summary>
public static readonly string[] Filter = ["Bio", "Regional", "Saisonal", "Vegan"];
public static readonly string[] Groessen = ["Klein", "Mittel", "Gross"];
public static readonly string[] Empfaenger = ["Anna", "Ben", "Cleo"];
public static readonly string[] Themen = BaueThemen();
private static string[] BaueThemen()
{
var themen = new string[12];
for (int i = 0; i < themen.Length; i++) themen[i] = $"Thema {i + 1}";
return themen;
}
internal static string Gewaehlt(string was, ChipGroup gruppe) =>
gruppe.SelectedItems.Count == 0 ? $"{was}: keine" : $"{was}: {string.Join(", ", gruppe.SelectedItems)}";
// Ein Eingabe-Chip entfernt sich aus seinem Panel.
internal static string Entferne(object? sender)
{
if (sender is not Chip { VisualParent: Panel panel } chip) return "";
panel.Children.Remove(chip);
return $"Entfernt: {chip.Content}";
}
public override UIElement Baue()
{
var meldung = new TextBlock { Text = "Bereit." };
var filter = new ChipGroup { ItemsSource = Filter, SelectionMode = SelectionMode.Multiple };
filter.SelectionChanged += (_, _) => meldung.Text = Gewaehlt("Filter", filter);
var groesse = new ChipGroup { ItemsSource = Groessen, IsSelectionRequired = true, SelectedIndex = 1 };
groesse.SelectionChanged += (_, _) => meldung.Text = Gewaehlt("Grösse", groesse);
var empfaenger = new WrapPanel();
foreach (var name in Empfaenger)
{
var chip = new Chip { Content = name, IsCloseIconVisible = true, Margin = new Thickness(0, 0, 8, 8) };
chip.CloseIconClick += (s, _) => meldung.Text = Entferne(s);
empfaenger.Children.Add(chip);
}
var themen = new ChipGroup { Width = 300, HorizontalAlignment = HorizontalAlignment.Left, ItemsSource = Themen, IsSingleLine = true };
themen.SelectionChanged += (_, _) => meldung.Text = Gewaehlt("Thema", themen);
return new StackPanel
{
Spacing = 8,
Children =
{
new TextBlock { Text = "Filter (Mehrfachwahl)", FontWeight = 600 },
filter,
new TextBlock { Text = "Grösse (Einzelwahl mit Pflicht)", FontWeight = 600 },
groesse,
new TextBlock { Text = "Empfänger", FontWeight = 600 },
empfaenger,
new TextBlock { Text = "Themen in einer Zeile", FontWeight = 600 },
themen,
meldung,
},
};
}
}