{"id":14963763,"url":"https://github.com/dirkster99/avalondock","last_synced_at":"2026-10-19T11:47:07.850Z","repository":{"id":27407190,"uuid":"113768809","full_name":"Dirkster99/AvalonDock","owner":"Dirkster99","description":"Our own development branch of the well known WPF document docking library","archived":false,"fork":false,"pushed_at":"2026-10-04T09:11:57.000Z","size":5780,"stargazers_count":1740,"open_issues_count":97,"forks_count":352,"subscribers_count":25,"default_branch":"master","last_synced_at":"2026-10-04T18:28:35.768Z","etag":null,"topics":["avalondock","control","csharp","dark-theme","dock","docking","docking-application","docking-framework","docking-library","dotnet","edi","ide","layout","light","light-theme","mllib","mvvm","theme","wpf","wpf-document"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"ms-pl","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Dirkster99.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2017-12-10T17:21:44.000Z","updated_at":"2026-10-02T02:01:34.000Z","dependencies_parsed_at":"2024-06-20T23:38:55.279Z","dependency_job_id":"30ca5947-61e4-4b05-a7a8-d162d5c3dd6b","html_url":"https://github.com/Dirkster99/AvalonDock","commit_stats":{"total_commits":772,"total_committers":66,"mean_commits":"11.696969696969697","dds":"0.30181347150259064","last_synced_commit":"30599e401419ad238187a3594f5dd85acaa5546b"},"previous_names":[],"tags_count":51,"template":false,"template_full_name":null,"purl":"pkg:github/Dirkster99/AvalonDock","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dirkster99%2FAvalonDock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dirkster99%2FAvalonDock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dirkster99%2FAvalonDock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dirkster99%2FAvalonDock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Dirkster99","download_url":"https://codeload.github.com/Dirkster99/AvalonDock/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dirkster99%2FAvalonDock/sbom","scorecard":{"id":40931,"data":{"date":"2025-08-11","repo":{"name":"github.com/Dirkster99/AvalonDock","commit":"30599e401419ad238187a3594f5dd85acaa5546b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":6,"reason":"Found 10/16 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Microsoft Public License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v4.72.1 not signed: https://api.github.com/repos/Dirkster99/AvalonDock/releases/117430729","Warn: release artifact v4.72.0 not signed: https://api.github.com/repos/Dirkster99/AvalonDock/releases/96805968","Warn: release artifact v4.71.2 not signed: https://api.github.com/repos/Dirkster99/AvalonDock/releases/90600974","Warn: release artifact v4.71.1 not signed: https://api.github.com/repos/Dirkster99/AvalonDock/releases/87255606","Warn: release artifact v.4.71.0 not signed: https://api.github.com/repos/Dirkster99/AvalonDock/releases/87211532","Warn: release artifact v4.72.1 does not have provenance: https://api.github.com/repos/Dirkster99/AvalonDock/releases/117430729","Warn: release artifact v4.72.0 does not have provenance: https://api.github.com/repos/Dirkster99/AvalonDock/releases/96805968","Warn: release artifact v4.71.2 does not have provenance: https://api.github.com/repos/Dirkster99/AvalonDock/releases/90600974","Warn: release artifact v4.71.1 does not have provenance: https://api.github.com/repos/Dirkster99/AvalonDock/releases/87255606","Warn: release artifact v.4.71.0 does not have provenance: https://api.github.com/repos/Dirkster99/AvalonDock/releases/87211532"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-14T21:30:44.246Z","repository_id":27407190,"created_at":"2025-08-14T21:30:44.246Z","updated_at":"2025-08-14T21:30:44.246Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":344872684,"owners_count":38356429,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-19T02:00:06.414Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avalondock","control","csharp","dark-theme","dock","docking","docking-application","docking-framework","docking-library","dotnet","edi","ide","layout","light","light-theme","mllib","mvvm","theme","wpf","wpf-document"],"created_at":"2024-09-24T13:32:07.035Z","updated_at":"2026-10-19T11:47:07.838Z","avatar_url":"https://github.com/Dirkster99.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AvalonDock\n\n[![CI](https://github.com/Dirkster99/AvalonDock/actions/workflows/release.yml/badge.svg)](https://github.com/Dirkster99/AvalonDock/actions/workflows/release.yml)\n[![Release](https://img.shields.io/github/release/Dirkster99/avalondock.svg)](https://github.com/Dirkster99/avalondock/releases/latest)\n[![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.svg)](http://nuget.org/packages/Dirkster.AvalonDock)\n\n![Net48](https://badgen.net/badge/Framework/.NET\u0026nbsp;4.8/blue) ![Net8](https://badgen.net/badge/Framework/.NET\u0026nbsp;8/blue) ![Net9](https://badgen.net/badge/Framework/.NET\u0026nbsp;9/blue) ![Net10](https://badgen.net/badge/Framework/.NET\u0026nbsp;10/blue)\n\nSupport this project with a :star: — report an issue, or even better, place a pull request :mailbox: :blush:\n\nAvalonDock is a WPF Document and Tool Window layout container that is used to arrange documents and tool windows in similar ways to many well known IDEs, such as Visual Studio, Eclipse, JetBrains Rider, and more. **Version 5.0** introduces first-class MVVM support, dependency injection integration, and a modular package architecture.\n\nAvalonDock is used by [many open source and commercial projects](https://github.com/search?p=4\u0026q=%22dirkster.avalondock%22\u0026type=Code), including:\n\n- [Stride](https://github.com/stride3d/stride) — Free and open-source cross-platform C# game engine\n- [Optick](https://github.com/bombomby/optick) — C++ Profiler for Games\n- [RoslynPad](https://github.com/roslynpad/roslynpad) — A cross-platform C# editor based on Roslyn and AvalonEdit\n- [WpfDesigner](https://github.com/icsharpcode/WpfDesigner) — The WPF Designer from SharpDevelop\n- [DaxStudio](https://github.com/DaxStudio/DaxStudio) — DAX query tool for Power BI and Analysis Services\n- [Macad3D](https://github.com/Macad3D/Macad3D) — Free and open-source 3D Construction Tool\n- [Edi](https://dirkster99.github.io/Edi/) — Open source text editor IDE based on AvalonDock and AvalonEdit\n- [Profile Explorer](https://github.com/microsoft/profile-explorer) — Microsoft CPU profiling trace viewer\n\nBe sure to check out the [Wiki](https://github.com/Dirkster99/AvalonDock/wiki) and the [documentation site](https://dirkster99.github.io/AvalonDock/) for tutorials and API reference.\n\n---\n\n## NuGet Packages\n\n### Core\n\n| Package | Downloads | Description |\n|:--------|:----------|:------------|\n| [Dirkster.AvalonDock](http://nuget.org/packages/Dirkster.AvalonDock) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.svg)](http://nuget.org/packages/Dirkster.AvalonDock) | Main WPF docking framework package |\n| [Dirkster.AvalonDock.Core](http://nuget.org/packages/Dirkster.AvalonDock.Core) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Core.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Core) | UI-agnostic interfaces and models |\n| [Dirkster.AvalonDock.Mvvm](http://nuget.org/packages/Dirkster.AvalonDock.Mvvm) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Mvvm.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Mvvm) | MVVM base classes (`DockableBase`, `ToolboxBase`, `DockLayoutService`) — no external dependencies |\n| [Dirkster.AvalonDock.Mvvm.CommunityToolkit](http://nuget.org/packages/Dirkster.AvalonDock.Mvvm.CommunityToolkit) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Mvvm.CommunityToolkit.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Mvvm.CommunityToolkit) | CommunityToolkit.Mvvm integration (`ObservableDockableBase`, `ObservableToolboxBase`) with `[ObservableProperty]` support |\n| [Dirkster.AvalonDock.DependencyInjection](http://nuget.org/packages/Dirkster.AvalonDock.DependencyInjection) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.DependencyInjection.svg)](http://nuget.org/packages/Dirkster.AvalonDock.DependencyInjection) | `IServiceCollection` extensions for DI registration |\n\n### Serializers\n\n| Package | Downloads | Description |\n|:--------|:----------|:------------|\n| [Dirkster.AvalonDock.Serializer.Xml](http://nuget.org/packages/Dirkster.AvalonDock.Serializer.Xml) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Serializer.Xml.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Serializer.Xml) | XML layout serialization |\n| [Dirkster.AvalonDock.Serializer.Json](http://nuget.org/packages/Dirkster.AvalonDock.Serializer.Json) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Serializer.Json.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Serializer.Json) | JSON layout serialization (**new in v5**) |\n\n### Themes\n\n| Package | Downloads | Description |\n|:--------|:----------|:------------|\n| [Dirkster.AvalonDock.Themes.Arc](http://nuget.org/packages/Dirkster.AvalonDock.Themes.Arc) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Themes.Arc.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Themes.Arc) | Arc theme **NEW!** |\n| [Dirkster.AvalonDock.Themes.Aero](http://nuget.org/packages/Dirkster.AvalonDock.Themes.Aero) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Themes.Aero.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Themes.Aero) | Aero theme |\n| [Dirkster.AvalonDock.Themes.Expression](http://nuget.org/packages/Dirkster.AvalonDock.Themes.Expression) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Themes.Expression.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Themes.Expression) | Expression theme |\n| [Dirkster.AvalonDock.Themes.Metro](http://nuget.org/packages/Dirkster.AvalonDock.Themes.Metro) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Themes.Metro.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Themes.Metro) | Metro theme |\n| [Dirkster.AvalonDock.Themes.VS](http://nuget.org/packages/Dirkster.AvalonDock.Themes.VS) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Themes.VS.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Themes.VS) | Visual Studio Themes (2015, 2022) incl. .vstheme support |\n| [Dirkster.AvalonDock.Themes.VS2010](http://nuget.org/packages/Dirkster.AvalonDock.Themes.VS2010) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Themes.VS2010.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Themes.VS2010) | Visual Studio 2010 theme (Legacy) |\n| [Dirkster.AvalonDock.Themes.VS2013](http://nuget.org/packages/Dirkster.AvalonDock.Themes.VS2013) | [![NuGet](https://img.shields.io/nuget/dt/Dirkster.AvalonDock.Themes.VS2013.svg)](http://nuget.org/packages/Dirkster.AvalonDock.Themes.VS2013) | Visual Studio 2013 theme (Legacy) |\n\n---\n\n## Quick Start\n\nInstall the packages you need:\n\n```bash\ndotnet add package Dirkster.AvalonDock\ndotnet add package Dirkster.AvalonDock.Mvvm\ndotnet add package Dirkster.AvalonDock.Mvvm.CommunityToolkit  # optional, for [ObservableProperty] support\ndotnet add package Dirkster.AvalonDock.DependencyInjection\ndotnet add package Dirkster.AvalonDock.Themes.Arc\n```\n\n---\n\n## Docking Manager\nThe `DockingManager` control is the main entry point for using AvalonDock in your WPF application. It provides the core docking functionality, including layout management, drag-and-drop support, and theme integration.\nAvalonDock also includes a `ToggleDockingManager` which adds a built-in sidebar for toggling tool windows, similar to VS Code's or Jetbrains IDE's behavior.\n\n### DockingManager\n\nThe standard `DockingManager` provides a blank canvas for custom layouts and is ideal for applications that require full control over the docking behavior and UI.\n\n\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Light/Document.png\" alt=\"ClassicDockingManager\" width=\"800\"\u003e\n\n### ToggleDockingManager\n\nThe `ToggleDockingManager` includes a built-in sidebar that automatically populates with registered tool windows (anchorable view models). This is perfect for applications that want a modern, out-of-the-box docking experience without manual layout management.\n\u003cimg src=\"docs/images/AvalonDockCodeApp_Dark_Welcome.png\" alt=\"AvalonDockCodeApp Dark Welcome\" width=\"800\"\u003e\n\n## Dependency Injection\n\nThe `AvalonDock.DependencyInjection` package provides `IServiceCollection` extension methods to wire up the entire docking system through your DI container. This replaces manual `DocumentsSource`/`AnchorablesSource` binding with a clean, service-oriented composition root.\n\n### Extension Methods\n\n| Method | Purpose |\n|:-------|:--------|\n| `AddDockLayoutService(configure)` | Register `IDockLayoutService` with a builder to configure toolboxes and toggle dock options in a single call |\n| `AddDockLayoutService()` | Register `IDockLayoutService` without builder configuration |\n| `AddAvalonDock\u003cTFactory\u003e()` | Register a custom `IFactory` implementation |\n| `AddAvalonDockSerializer\u003cT\u003e()` | Register an `ILayoutSerializer` (XML or JSON) |\n| `AddAvalonDockThemeManager\u003cT\u003e()` | Register a theme manager |\n| `AddDockingManager(factory)` | Register an `IDockingManager` wrapper |\n| `AddAutoHideManager\u003cT\u003e()` | Register an auto-hide manager |\n| `AddFloatingWindowService\u003cT\u003e()` | Register a floating window service |\n| `AddDragDropHandler\u003cT\u003e()` | Register a custom drag-and-drop handler |\n\n#### DockLayoutBuilder Methods\n\n| Method | Purpose |\n|:-------|:--------|\n| `ConfigureToggleDock(configure)` | Configure sidebar button size, default dock dimensions, and layout priority |\n| `AddToolbox\u003cT\u003e()` | Register a toolbox (anchorable) view model as a singleton |\n| `AddToolbox\u003cT\u003e(factory)` | Register a toolbox with a custom factory for constructor parameters |\n\n### Composition Root Example\n\n```csharp\nusing AvalonDock.Core;\nusing AvalonDock.DependencyInjection;\nusing Microsoft.Extensions.DependencyInjection;\n\npublic partial class App : Application\n{\n    private IServiceProvider? _serviceProvider;\n\n    protected override void OnStartup(StartupEventArgs e)\n    {\n        base.OnStartup(e);\n\n        var services = new ServiceCollection();\n\n        // Configure dock layout: toggle dock options + toolboxes in one call\n        services.AddDockLayoutService(dock =\u003e\n        {\n            dock.ConfigureToggleDock(opts =\u003e\n            {\n                opts.ButtonSize = 28;\n                opts.DefaultDockWidth = 280;\n                opts.DefaultDockHeight = 220;\n                opts.LayoutPriority = nameof(AvalonDock.DockLayoutPriority.BottomFullWidth);\n            });\n\n            dock.AddToolbox\u003cExplorerToolbox\u003e();\n            dock.AddToolbox\u003cSearchToolbox\u003e();\n            dock.AddToolbox\u003cTerminalToolbox\u003e();\n        });\n\n        services.AddSingleton\u003cMainViewModel\u003e();\n        services.AddSingleton\u003cMainWindow\u003e();\n\n        _serviceProvider = services.BuildServiceProvider();\n        _serviceProvider.GetRequiredService\u003cMainWindow\u003e().Show();\n    }\n\n    protected override void OnExit(ExitEventArgs e)\n    {\n        (_serviceProvider as IDisposable)?.Dispose();\n        base.OnExit(e);\n    }\n}\n```\n\n### Layout Priority Options\n\nThe `LayoutPriority` setting controls how panels are arranged when multiple panels are docked:\n\n| Priority | Behavior | Similar To |\n|:---------|:---------|:-----------|\n| `BottomFullWidth` | Bottom panel spans the full window width | JetBrains Rider |\n| `SidesFullHeight` | Side panels span the full window height | VS Code |\n| `Default` | No automatic restructuring | Classic AvalonDock |\n\nFor a complete walkthrough, see the [Dependency Injection tutorial](docs/tutorials/dependency-injection-app.md).\n\n---\n\n## MVVM\n\nThe `AvalonDock.Mvvm` package provides ready-to-use view model base classes with zero external dependencies. These classes implement the core interfaces from `AvalonDock.Core` and handle property change notifications, serialization attributes, and docking behavior out of the box.\n\nFor projects using [CommunityToolkit.Mvvm](https://github.com/CommunityToolkit/dotnet) source generators (`[ObservableProperty]`, `[RelayCommand]`), install the optional `AvalonDock.Mvvm.CommunityToolkit` package which provides `ObservableObject`-based equivalents.\n\n### Base Classes\n\n**`AvalonDock.Mvvm`** (no external dependencies):\n\n| Class | Purpose |\n|:------|:--------|\n| `DockableBase` | Base for all dockable view models — provides `Id`, `Title`, `CanClose`, `CanFloat`, `CanPin`, `IsModified`, `DockState`, and more |\n| `ToolboxBase` | Base for toolbox (anchorable) view models — adds `Zone`, `IsOpenByDefault`, `ToolTipText`, and `Icon` |\n| `DockBase` | Container for multiple dockables — manages `VisibleDockables`, `ActiveDockable`, and navigation |\n| `RootDock` | Root of the layout tree — manages floating and pinned dockables |\n| `DocumentDock` | Container for document tabs |\n| `ToolDock` | Container for tool windows with `Alignment` and `AutoHide` support |\n\n**`AvalonDock.Mvvm.CommunityToolkit`** (requires CommunityToolkit.Mvvm):\n\n| Class | Purpose |\n|:------|:--------|\n| `ObservableDockableBase` | `ObservableObject`-based equivalent of `DockableBase` — supports `[ObservableProperty]` and `[RelayCommand]` |\n| `ObservableToolboxBase` | `ObservableObject`-based equivalent of `ToolboxBase` |\n| `ObservableDockBase` | `ObservableObject`-based equivalent of `DockBase` |\n| `ObservableDocument` / `ObservableTool` | Leaf dockable classes for documents and tools |\n\n### Creating a Toolbox View Model\n\nUsing `AvalonDock.Mvvm` (no external dependencies):\n\n```csharp\nusing AvalonDock.Core;\nusing AvalonDock.Mvvm;\n\npublic class ExplorerToolbox : ToolboxBase\n{\n    public ExplorerToolbox()\n    {\n        Id = \"Explorer\";\n        Title = \"Explorer\";\n        Zone = DockZone.LeftTop;        // Sidebar placement zone\n        IsOpenByDefault = true;          // Open when app starts\n        ToolTipText = \"Solution Explorer\";\n    }\n}\n```\n\nUsing `AvalonDock.Mvvm.CommunityToolkit` (with `[ObservableProperty]` support):\n\n```csharp\nusing AvalonDock.Core;\nusing AvalonDock.Mvvm.CommunityToolkit;\nusing CommunityToolkit.Mvvm.ComponentModel;\n\npublic partial class ExplorerToolbox : ObservableToolboxBase\n{\n    [ObservableProperty] private string _searchFilter = string.Empty;\n\n    public ExplorerToolbox()\n    {\n        Id = \"Explorer\";\n        Title = \"Explorer\";\n        Zone = DockZone.LeftTop;\n        IsOpenByDefault = true;\n        ToolTipText = \"Solution Explorer\";\n    }\n}\n```\n\n### Dock Zones\n\nToolboxes declare their sidebar placement using `DockZone`:\n\n| Zone | Position |\n|:-----|:---------|\n| `LeftTop` / `LeftBottom` | Left sidebar |\n| `RightTop` / `RightBottom` | Right sidebar |\n| `BottomLeft` / `BottomRight` | Bottom panel |\n\n### IDockLayoutService\n\n`IDockLayoutService` is the central service for managing documents and toolboxes at runtime:\n\n```csharp\npublic class MainViewModel\n{\n    private readonly IDockLayoutService _dockService;\n\n    public MainViewModel(IDockLayoutService dockService)\n    {\n        _dockService = dockService;\n    }\n\n    // Open a new document\n    public void OpenFile(string filePath)\n    {\n        _dockService.OpenOrActivateDocument(\n            existing =\u003e existing.FilePath == filePath,\n            () =\u003e new EditorTabViewModel { Title = Path.GetFileName(filePath) });\n    }\n\n    // Close a document\n    public void CloseFile(IDockable document) =\u003e _dockService.CloseDocument(document);\n\n    // Access a registered toolbox by type\n    public ExplorerToolbox? Explorer =\u003e _dockService.GetAnchorable\u003cExplorerToolbox\u003e();\n\n    // Iterate all open documents\n    public IEnumerable\u003cIDockable\u003e Documents =\u003e _dockService.Documents;\n\n    // Bind this to ToggleDockingManager.DockLayout in XAML\n    public IRootDock DockLayout =\u003e _dockService.Layout;\n}\n```\n\n### XAML Binding\n\nFor the `ToggleDockingManager`, bind the `DockLayout` property to your view model:\n\n```xml\n\u003cavalonDock:ToggleDockingManager x:Name=\"dockManager\"\n    DockLayout=\"{Binding DockLayout}\"\n    LayoutItemContainerStyleSelector=\"{StaticResource PanesStyleSelector}\" /\u003e\n```\n\nFor the classic `DockingManager`, bind the `DockLayout` to the `Layout` property:\n\n```xml\n\u003cavalonDock:DockingManager x:Name=\"dockManager\"\n    Layout=\"{Binding DockLayout}\"\n    LayoutItemContainerStyleSelector=\"{StaticResource PanesStyleSelector}\" /\u003e\n```\n---\n\n## Architecture (v5.0)\n\nAvalonDock v5 is organized into modular packages with clear separation of concerns:\n\n```\nAvalonDock.Core            UI-agnostic interfaces (IDockable, IDock, IFactory, IToolbox, etc.)\n  └── netstandard2.0       Cross-platform abstractions\n\nAvalonDock.Mvvm            MVVM base classes (DockableBase, ToolboxBase, etc.) — no external deps\n  └── netstandard2.0\n\nAvalonDock.Mvvm.CommunityToolkit  CommunityToolkit.Mvvm integration ([ObservableProperty] support)\n  └── netstandard2.0\n\nAvalonDock.DependencyInjection  IServiceCollection extensions\n  └── netstandard2.0\n\nAvalonDock                 WPF docking library (DockingManager, ToggleDockingManager)\n  ├── net8.0-windows\n  ├── net9.0-windows\n  ├── net10.0-windows\n  └── net48\n\nAvalonDock.Serializer.Xml  XML layout persistence (extracted from core in v5)\nAvalonDock.Serializer.Json JSON layout persistence (new in v5)\nAvalonDock.Themes.*        Theme packages (Arc, Aero, Expression, Metro, VS2010, VS2013)\n```\n\n## Theming\n\n### Arc Theme (NEW!)\n\nModern theme with compact tabs, rounded corners, and semi-transparent design elements:\n\n```csharp\ndockManager.Theme = new ArcDarkTheme();  // Dark mode\ndockManager.Theme = new ArcLightTheme(); // Light mode\n```\n\n### VS2013 Theme\n\nClassic Visual Studio 2013 look with Dark, Light, and Blue variants:\n\n```csharp\ndockManager.Theme = new Vs2013DarkTheme();\ndockManager.Theme = new Vs2013LightTheme();\ndockManager.Theme = new Vs2013BlueTheme();\n```\n\n### Other Themes\n\n- **VS2010** — Visual Studio 2010 style\n- **Expression Dark/Light** — Expression Blend inspired\n- **Metro** — Modern Metro/WinUI style\n- **Aero** — Classic Windows Aero theme\n\n---\n\n## Migrating from v4.x\n\nVersion 5.0.0 includes several breaking changes. See the full [Breaking Changes](docs/migration/breaking-changes.md) guide.\n\n### Key Changes\n\n| Change | Impact | Action |\n|:-------|:-------|:-------|\n| XML serializer moved to `AvalonDock.Serializer.Xml` | High | Install serializer package, update `using` statements |\n| Namespace `AvalonDock.Layout.Serialization` → `AvalonDock.Serializer.Xml` | High | Update `using` statements |\n| .NET Framework \u003c 4.8 dropped | High | Upgrade target framework |\n| .NET Core 3.x / 5 dropped | High | Upgrade target framework |\n| `ILayoutEngine` introduced | Low | No action for default behavior |\n\n### Supported Frameworks\n\n- **.NET Framework 4.8**\n- **.NET 8.0** (`net8.0-windows`)\n- **.NET 9.0** (`net9.0-windows`)\n- **.NET 10.0** (`net10.0-windows`)\n\n---\n\n## Building from Source\n\nThis project requires **Windows** (WPF is Windows-only) and **.NET SDK 9.0.x / 10.0.x**.\n\n```bash\ndotnet restore source/AvalonDock.sln\ndotnet build source/AvalonDock.sln --configuration Release --no-restore\ndotnet test source/AvalonDock.sln --configuration Release --no-restore -m:1\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for more details.\n\n---\n\n## Screenshots\n\n### ToggleDockingManager\n\u003ctable width=\"100%\"\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eDescription\u003c/td\u003e\n      \u003ctd\u003eDark\u003c/td\u003e\n      \u003ctd\u003eLight\u003c/td\u003e\n   \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eDock Document\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"docs/images/AvalonDockCodeApp_Dark_Drag_Document.png\" width=\"400\"\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"docs/images/AvalonDockCodeApp_Light_Drag_Document.png\" width=\"400\"\u003e\u003c/td\u003e\n   \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eDock Tool Window\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"docs/images/AvalonDockCodeApp_Dark_Drag.png\" width=\"400\"\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"docs/images/AvalonDockCodeApp_Light_Drag.png\" width=\"400\"\u003e\u003c/td\u003e\n   \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eDocument\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"docs/images/AvalonDockCodeApp_Dark_Welcome.png\" width=\"400\"\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"docs/images/AvalonDockCodeApp_Light_Welcome.png\" width=\"400\"\u003e\u003c/td\u003e\n   \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eTool Window\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"docs/images/AvalonDockCodeApp_Dark_Toolbox.png\" width=\"400\"\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"docs/images/AvalonDockCodeApp_Light_Toolbox.png\" width=\"400\"\u003e\u003c/td\u003e\n   \u003c/tr\u003e\n\u003c/table\u003e\n\n### Classic DockingManager\n\u003ctable width=\"100%\"\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eDescription\u003c/td\u003e\n      \u003ctd\u003eDark\u003c/td\u003e\n      \u003ctd\u003eLight\u003c/td\u003e\n   \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eDock Document\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Dark/DockDocument.png\" width=\"400\"\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Light/DockDocument.png\" width=\"400\"\u003e\u003c/td\u003e\n   \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eDock Document\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Dark/DockDocument_1.png\" width=\"400\"\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Light/DockDocument_1.png\" width=\"400\"\u003e\u003c/td\u003e\n   \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eDock Tool Window\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Dark/DockToolWindow.png\" width=\"400\"\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Light/DockToolWindow.png\" width=\"400\"\u003e\u003c/td\u003e\n   \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eDocument\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Dark/Document.png\" width=\"400\"\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Light/Document.png\" width=\"400\"\u003e\u003c/td\u003e\n   \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003eTool Window\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Dark/ToolWindow.png\" width=\"400\"\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/Dirkster99/Docu/master/AvalonDock/VS2013/AD_MLib/Light/ToolWindow.png\" width=\"400\"\u003e\u003c/td\u003e\n   \u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Release History\n\nFor detailed release notes and version history, see the [GitHub Releases](https://github.com/Dirkster99/AvalonDock/releases) page.\n\n## More Resources\n\n- [Documentation](docs/)\n- [Project Wiki](https://github.com/Dirkster99/AvalonDock/wiki)\n- [DI Tutorial](docs/tutorials/dependency-injection-app.md)\n- [Breaking Changes (v5.0)](docs/migration/breaking-changes.md)\n- [Contributing Guidelines](CONTRIBUTING.md)\n- [License (MS-PL)](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdirkster99%2Favalondock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdirkster99%2Favalondock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdirkster99%2Favalondock/lists"}