{"record":{"id":"781f00893a1febb3","repo":"MaterialDesignInXAML/MaterialDesignInXamlToolkit","slug":"this-element-has-no-adorner-layer","errorCode":null,"errorMessage":"This element has no adorner layer.","messagePattern":"This element has no adorner layer\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/MaterialDesignThemes.Wpf/AdornerExtensions.cs","lineNumber":20,"sourceCode":"\nnamespace MaterialDesignThemes.Wpf;\n\n/// <summary>\n/// This is a simple utility to add and remove a single adorner to an element\n/// since there is no built-in way to do that in xaml.\n/// <a href=\"https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/adorners-overview\">See here</a>\n/// </summary>\ninternal static class AdornerExtensions\n{\n    public static void AddAdorner<TAdorner>(this UIElement element, TAdorner adorner) where TAdorner : Adorner\n    {\n        if (adorner is null)\n        {\n            throw new ArgumentNullException(nameof(adorner));\n        }\n\n        var adornerLayer = AdornerLayer.GetAdornerLayer(element)\n            ?? throw new InvalidOperationException(\"This element has no adorner layer.\");\n\n        adornerLayer.Add(adorner);\n    }\n\n    public static void RemoveAdorners<TAdorner>(this UIElement element) where TAdorner : Adorner\n    {\n        var adornerLayer = AdornerLayer.GetAdornerLayer(element);\n        var adorners = adornerLayer?.GetAdorners(element);\n\n        if (adorners is null)\n        {\n            return;\n        }\n\n        foreach (var adorner in adorners.OfType<TAdorner>())\n        {\n            adornerLayer!.Remove(adorner);\n        }","sourceCodeStart":2,"sourceCodeEnd":38,"githubUrl":"https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/blob/98edec3a0b96ef272c587b14bcd67ef5f928a7ed/src/MaterialDesignThemes.Wpf/AdornerExtensions.cs#L2-L38","documentation":"`AdornerExtensions.AddAdorner<TAdorner>` fetches the `AdornerLayer` for a `UIElement` via `AdornerLayer.GetAdornerLayer(element)`. In WPF that returns null when the element is not yet part of a realized visual tree (e.g. no parent window/presentation source), so the extension throws `InvalidOperationException` rather than dereferencing null.","triggerScenarios":"Calling `element.AddAdorner(adorner)` on a `UIElement` that is not yet in the visual tree, before `Loaded`, after being removed from its parent, or on an element in a disconnected `UserControl`/popup.","commonSituations":"Attaching adorners in the constructor or `Initialized` instead of `Loaded`; adorning a templated element before template application; adorning an element whose window was closed; adorning inside a `Popup` before it is shown.","solutions":["Defer `AddAdorner` until the element's `Loaded` event (or `OnContentRendered` of the window), guaranteeing an adorner layer exists.","Check `AdornerLayer.GetAdornerLayer(element) != null` before calling, and retry on `LayoutUpdated`/`Loaded` if null.","Ensure the element is parented in a visible window when you adorn it.","Remove adorners in `Unloaded`/`Closed` to avoid stale references when the tree is torn down."],"exampleFix":"// before\nvar layer = AdornerLayer.GetAdornerLayer(tb); // null in ctor -> throws later\nmyAdorner...; tb.AddAdorner(new MyAdorner(tb));\n\n// after\ntb.Loaded += (s, e) =>\n{\n    if (AdornerLayer.GetAdornerLayer(tb) is { } layer)\n        layer.Add(new MyAdorner(tb));\n};","handlingStrategy":"validation","validationCode":"void SafeAddAdorner(UIElement element, Adorner adorner)\n{\n    if (AdornerLayer.GetAdornerLayer(element) is { } layer)\n        layer.Add(adorner);\n    else\n        element.Loaded += (s, _) => AdornerLayer.GetAdornerLayer(element)?.Add(adorner);\n}","typeGuard":"static bool HasAdornerLayer(UIElement element)\n    => AdornerLayer.GetAdornerLayer(element) is not null;","tryCatchPattern":null,"preventionTips":["Add adorners in Loaded, not in constructors/Initialized.","Remove adorners in Unloaded/Closed to avoid stale references.","Check GetAdornerLayer for null before adding."],"tags":["wpf","adorner","visual-tree","lifecycle","material-design"],"backgroundTag":null,"analyzedSha":"98edec3a0b96ef272c587b14bcd67ef5f928a7ed","analyzedAt":"2026-08-13T14:31:19.111Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}