Table of Contents

MDI Document Layout

Dock can display documents as classic MDI windows inside a document dock. In this mode documents become movable, resizable windows with minimize, maximize, and restore states.

Enable MDI mode

Set the layout mode on a document dock:

var documents = new DocumentDock
{
    LayoutMode = DocumentLayoutMode.Mdi
};

If you prefer fluent setup:

factory.DocumentDock(out var documents)
       .WithLayoutMode(DocumentLayoutMode.Mdi);

Arrange documents

Document docks expose commands for common MDI layout operations:

documents.CascadeDocuments?.Execute(null);
documents.TileDocumentsHorizontal?.Execute(null);
documents.TileDocumentsVertical?.Execute(null);
documents.RestoreDocuments?.Execute(null);

The commands use the dock’s current visible bounds to compute layouts.

Document state and bounds

Documents implement IMdiDocument and store their window bounds and state:

  • MdiBounds stores the normal window rectangle.
  • MdiState tracks Normal, Minimized, and Maximized states.
  • MdiZIndex controls stacking order.

These values are serialized with the layout so windows restore to their previous positions.

MDI control customization

The Avalonia controls expose additional properties for theming:

  • MdiDocumentControl forwards IconTemplate, HeaderTemplate, ModifiedTemplate, CloseTemplate, and CloseButtonTheme to each window.
  • MdiDocumentWindow exposes DocumentContextMenu, MdiState, and IsActive for styling or interaction.

IDocumentDock.EmptyContent defines placeholder content shown when a document host has no visible dockables. In MDI mode, MdiDocumentControl.EmptyContentTemplate can optionally control how that content is rendered:

using Avalonia.Controls;
using Avalonia.Controls.Templates;

var documents = new DocumentDock
{
    LayoutMode = DocumentLayoutMode.Mdi,
    EmptyContent = "No documents are open"
};

var mdiDocumentControl = new MdiDocumentControl
{
    DataContext = documents,
    EmptyContentTemplate = new FuncDataTemplate<string>((text, _) =>
        new TextBlock { Text = text }, true)
};

To customize the layout algorithm, provide an IMdiLayoutManager implementation. It can be assigned on MdiDocumentControl.LayoutManager (which the default template forwards to MdiLayoutPanel):

var mdiLayoutManager = new MyMdiLayoutManager();
mdiDocumentControl.LayoutManager = mdiLayoutManager;

For details on the built-in layout helpers and defaults see MDI layout helpers.

Notes

  • The document header contains a drag handle that starts docking operations when you drag it outside the MDI surface.
  • When a document is maximized the stored bounds remain unchanged so restore returns to the previous size.
  • Managed floating windows reuse MdiDocumentWindow inside ManagedWindowLayer when DockSettings.UseManagedWindows is enabled. See the Managed windows guide.

For an overview of all guides see the documentation index.