Zum Inhalt
Kuonen.UI

Splitter

Der Splitter aus WinForms liegt in einem DockPanel direkt hinter dem Element, dessen Grösse er bestimmt (an derselben Seite: links, rechts, oben oder unten). Ziehen Sie ihn mit der Maus oder fokussieren Sie ihn und nutzen Sie die Pfeiltasten. Wird das Fenster grösser, behält das angedockte Element seine Grösse, nur der Rest wächst. SplitterWidth bestimmt die Dicke, MinSize und MinExtra die Grenzen.

Vorführung: SplitterVorführung: Splitter

KXAML

SplitterSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            x:Class="Kuonen.UI.Galerie.Seiten.SplitterVorfuehrung"
            Spacing="8">
  <!-- Der Splitter steht direkt hinter dem Element, dessen Grösse er bestimmt, an derselben Seite; das letzte Kind füllt den Rest. -->
  <DockPanel Height="240" MinWidth="300">
    <Border DockPanel.Dock="Left" Width="140" Background="#CCE4F7">
      <TextBlock Text="Links: bleibt beim Vergrössern" Foreground="#1B1B1B" Margin="8" TextWrapping="Wrap" />
    </Border>
    <Splitter x:Name="LinksTeiler" DockPanel.Dock="Left" MinSize="60" SplitterMoved="Teiler_Bewegt" />
    <Border DockPanel.Dock="Bottom" Height="60" Background="#FDE7C5">
      <TextBlock Text="Unten" Foreground="#1B1B1B" Margin="8" TextWrapping="Wrap" />
    </Border>
    <Splitter x:Name="UntenTeiler" DockPanel.Dock="Bottom" MinSize="30" SplitterMoved="Teiler_Bewegt" />
    <Border Background="#D3F0D4">
      <TextBlock Text="Rest: wächst mit dem Fenster" Foreground="#1B1B1B" Margin="8" TextWrapping="Wrap" />
    </Border>
  </DockPanel>
  <TextBlock x:Name="Stand" Text="Ziehen Sie einen Splitter oder drücken Sie eine Pfeiltaste." />
  <CheckBox x:Name="Dick" Content="SplitterWidth 8" Click="Dick_Click" />
</StackPanel>
SplitterSeite.kxaml.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Ereignisse;

namespace Kuonen.UI.Galerie.Seiten;

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

/// <summary>KXAML-Fassung der Splitter-Seite: der Baum steht in SplitterSeite.kxaml, hier nur das Verhalten.</summary>
public sealed partial class SplitterVorfuehrung
{
    public SplitterVorfuehrung() => InitializeComponent();

    private void Teiler_Bewegt(object? sender, SplitterEventArgs e) =>
        Stand.Text = $"Links: {Math.Round(LinksTeiler.SplitPosition)}    Unten: {Math.Round(UntenTeiler.SplitPosition)}";

    private void Dick_Click(object sender, RoutedEventArgs e)
    {
        foreach (var t in new[] { LinksTeiler, UntenTeiler })
        {
            if (Dick.IsChecked == true) t.SplitterWidth = 8;
            else t.ClearValue(Splitter.SplitterWidthProperty);
        }
    }
}

C#

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

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: <see cref="Splitter"/> (WinForms).</summary>
public sealed partial class SplitterSeite : GalerieSeite
{
    public override string Titel => "Splitter";

    public override string Beschreibung =>
        "Der Splitter aus WinForms liegt in einem DockPanel direkt hinter dem Element, dessen Grösse er bestimmt (an derselben Seite: links, rechts, "
        + "oben oder unten). Ziehen Sie ihn mit der Maus oder fokussieren Sie ihn und nutzen Sie die Pfeiltasten. Wird das Fenster grösser, behält "
        + "das angedockte Element seine Grösse, nur der Rest wächst. SplitterWidth bestimmt die Dicke, MinSize und MinExtra die Grenzen.";

    public override string Stichworte => "Splitter Teiler WinForms DockPanel Dock SplitterWidth SplitPosition MinSize MinExtra SplitterMoved Grösse ziehen";

    public override string Datei => nameof(SplitterSeite);

    private static readonly SolidColorBrush Schwarz = new(Color.FromRgb(0x1B, 0x1B, 0x1B));

    private static Border Feld(string text, uint farbe) => new()
    {
        Background = new SolidColorBrush(Color.FromRgb((byte)(farbe >> 16), (byte)(farbe >> 8), (byte)farbe)),
        Child = new TextBlock { Text = text, Foreground = Schwarz, Margin = new Thickness(8), TextWrapping = TextWrapping.Wrap },
    };

    public override UIElement Baue()
    {
        var links = Feld("Links: bleibt beim Vergrössern", 0xCCE4F7);
        links.Width = 140;
        DockPanel.SetDock(links, Dock.Left);
        var linksTeiler = new Splitter { Dock = Dock.Left, MinSize = 60 };
        var unten = Feld("Unten", 0xFDE7C5);
        unten.Height = 60;
        DockPanel.SetDock(unten, Dock.Bottom);
        var untenTeiler = new Splitter { Dock = Dock.Bottom, MinSize = 30 };
        var rest = Feld("Rest: wächst mit dem Fenster", 0xD3F0D4);
        var flaeche = new DockPanel { Height = 240, MinWidth = 300, Children = { links, linksTeiler, unten, untenTeiler, rest } };

        var stand = new TextBlock { Text = "Ziehen Sie einen Splitter oder drücken Sie eine Pfeiltaste." };
        void Zeige(object? _, SplitterEventArgs __) =>
            stand.Text = $"Links: {Math.Round(linksTeiler.SplitPosition)}    Unten: {Math.Round(untenTeiler.SplitPosition)}";
        linksTeiler.SplitterMoved += Zeige;
        untenTeiler.SplitterMoved += Zeige;
        var dick = new CheckBox { Content = "SplitterWidth 8" };
        dick.Click += (_, _) =>
        {
            double breite = dick.IsChecked == true ? 8 : double.NaN;
            foreach (var t in new[] { linksTeiler, untenTeiler })
            {
                if (double.IsNaN(breite)) t.ClearValue(Splitter.SplitterWidthProperty);
                else t.SplitterWidth = breite;
            }
        };

        var seite = new StackPanel { Spacing = 8 };
        seite.Children.Add(flaeche);
        seite.Children.Add(stand);
        seite.Children.Add(dick);
        return seite;
    }
}