Zum Inhalt
Kuonen.UI

MDI

Kindfenster in einer Fläche wie WinForms-MDI: verschieben, Grösse ändern, minimieren, maximieren; überlappend, untereinander, nebeneinander anordnen; Strg+F6 wechselt. Darstellung als Reiter (Standard) oder als freie Fenster.

Vorführung: MDIVorführung: MDI

KXAML

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

namespace Kuonen.UI.Galerie.Seiten;

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

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

C#

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

namespace Kuonen.UI.Galerie.Seiten;

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

    public override string Beschreibung => "Kindfenster in einer Fläche wie WinForms-MDI: verschieben, Grösse ändern, minimieren, maximieren; überlappend, untereinander, nebeneinander anordnen; Strg+F6 wechselt. Darstellung als Reiter (Standard) oder als freie Fenster.";

    public override string Stichworte => "MDI MdiClient MdiChildWindow LayoutMdi Cascade Tile IsMdiContainer MdiParent Fenstermenü Reiter";

    public override string Datei => nameof(MdiSeite);

    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)
    {
        var client = new MdiClient { Width = 640, Height = 360, Darstellung = MdiDarstellung.Fenster };
        int n = 0;
        void Neu() => client.MdiChildren.Add(new MdiChildWindow { Title = "Dokument " + ++n, Content = new TextBox { Text = "Inhalt " + n, AcceptsReturn = true } });
        for (int i = 0; i < 3; i++) Neu();
        flaeche.Children.Add(Zeile(
            Knopf("Neu", Neu),
            Knopf("Überlappend", () => client.LayoutMdi(MdiLayout.Cascade)),
            Knopf("Untereinander", () => client.LayoutMdi(MdiLayout.TileHorizontal)),
            Knopf("Nebeneinander", () => client.LayoutMdi(MdiLayout.TileVertical)),
            Knopf("Reiter / Fenster", () => client.Darstellung = client.Darstellung == MdiDarstellung.Fenster ? MdiDarstellung.Reiter : MdiDarstellung.Fenster)));
        flaeche.Children.Add(client);
    }
}