CheckedListBox
Eine Liste mit einem Kästchen je Eintrag, wie in WinForms. Ein Klick auf das Kästchen kreuzt an, ein Klick auf den Text wählt (mit „CheckOnClick“ kreuzt jeder Klick an); die Leertaste kreuzt den Eintrag mit dem Fokus an. ItemCheck kommt vor jeder Änderung und darf sie ablehnen: hier bleibt „Zitronen“ immer leer.


KXAML
CheckedListBoxSeite.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.CheckedListBoxVorfuehrung"
Spacing="12">
<CheckBox Content="Jeder Klick kreuzt an (CheckOnClick)" Checked="JederKlick_Checked" Unchecked="JederKlick_Unchecked" />
<!-- ItemCheck kommt vor jeder Änderung und darf sie ablehnen. -->
<CheckedListBox x:Name="Liste" Width="240" Height="180" ItemsSource="{x:Static local:CheckedListBoxVorfuehrung.Obst}" ItemCheck="Liste_ItemCheck" />
<TextBlock x:Name="Meldung" Text="Nichts angekreuzt." />
</StackPanel>CheckedListBoxSeite.kxaml.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Ereignisse;
namespace Kuonen.UI.Galerie.Seiten;
public sealed partial class CheckedListBoxSeite
{
protected override Func<UIElement>? KxamlFabrik => () => new CheckedListBoxVorfuehrung();
}
/// <summary>KXAML-Fassung der CheckedListBox-Seite: der Baum steht in CheckedListBoxSeite.kxaml, hier die Daten und das Verhalten.</summary>
public sealed partial class CheckedListBoxVorfuehrung
{
/// <summary>Die Einträge (im KXAML über x:Static).</summary>
public static readonly string[] Obst = ["Äpfel", "Birnen", "Kirschen", "Pflaumen", "Quitten", "Zitronen"];
public CheckedListBoxVorfuehrung() => InitializeComponent();
// ItemCheck kommt vor der Änderung: „Zitronen“ wird abgelehnt, der Text zählt mit dem neuen Zustand.
private void Liste_ItemCheck(object? sender, ItemCheckEventArgs e)
{
if (Equals(Liste.Items[e.Index], "Zitronen")) e.NewValue = e.CurrentValue;
int anzahl = Liste.CheckedItems.Count + (e.NewValue != CheckState.Unchecked ? 1 : 0) - (e.CurrentValue != CheckState.Unchecked ? 1 : 0);
Meldung.Text = anzahl == 0 ? "Nichts angekreuzt." : $"{anzahl} angekreuzt.";
}
private void JederKlick_Checked(object sender, RoutedEventArgs e) => Liste.CheckOnClick = true;
private void JederKlick_Unchecked(object sender, RoutedEventArgs e) => Liste.CheckOnClick = false;
}C#
CheckedListBoxSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;
namespace Kuonen.UI.Galerie.Seiten;
/// <summary>Galerie-Seite: <see cref="CheckedListBox"/>.</summary>
public sealed partial class CheckedListBoxSeite : GalerieSeite
{
public override string Titel => "CheckedListBox";
public override string Beschreibung =>
"Eine Liste mit einem Kästchen je Eintrag, wie in WinForms. Ein Klick auf das Kästchen kreuzt an, ein Klick auf den Text wählt "
+ "(mit „CheckOnClick“ kreuzt jeder Klick an); die Leertaste kreuzt den Eintrag mit dem Fokus an. ItemCheck kommt vor jeder Änderung "
+ "und darf sie ablehnen: hier bleibt „Zitronen“ immer leer.";
public override string Stichworte => "Kontrollkästchen Liste CheckedItems CheckedIndices CheckOnClick ItemCheck CheckState WinForms";
public override string Datei => nameof(CheckedListBoxSeite);
public override UIElement Baue()
{
var liste = new CheckedListBox { Width = 240, Height = 180, ItemsSource = new[] { "Äpfel", "Birnen", "Kirschen", "Pflaumen", "Quitten", "Zitronen" } };
var meldung = new TextBlock { Text = "Nichts angekreuzt." };
liste.ItemCheck += (_, e) =>
{
// ItemCheck kommt vor der Änderung: „Zitronen“ wird abgelehnt, der Text zählt mit dem neuen Zustand.
if (Equals(liste.Items[e.Index], "Zitronen")) e.NewValue = e.CurrentValue;
int anzahl = liste.CheckedItems.Count + (e.NewValue != CheckState.Unchecked ? 1 : 0) - (e.CurrentValue != CheckState.Unchecked ? 1 : 0);
meldung.Text = anzahl == 0 ? "Nichts angekreuzt." : $"{anzahl} angekreuzt.";
};
var jederKlick = new CheckBox { Content = "Jeder Klick kreuzt an (CheckOnClick)" };
jederKlick.Checked += (_, _) => liste.CheckOnClick = true;
jederKlick.Unchecked += (_, _) => liste.CheckOnClick = false;
var seite = new StackPanel { Spacing = 12 };
seite.Children.Add(jederKlick);
seite.Children.Add(liste);
seite.Children.Add(meldung);
return seite;
}
}