{"record":{"id":"493456b7f92c6ba0","repo":"AvaloniaUI/Avalonia","slug":"composition-visuals-belong-to-different-compositor","errorCode":null,"errorMessage":"Composition visuals belong to different compositor instances","messagePattern":"Composition visuals belong to different compositor instances","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Avalonia.Base/Rendering/Composition/ElementCompositionPreview.cs","lineNumber":25,"sourceCode":"/// Enables access to composition visual objects that back XAML elements in the XAML composition tree.\n/// </summary>\npublic static class ElementComposition\n{\n    /// <summary>\n    /// Gets CompositionVisual that backs a Visual\n    /// </summary>\n    /// <param name=\"visual\"></param>\n    /// <returns></returns>\n    public static CompositionVisual? GetElementVisual(Visual visual) => visual.CompositionVisual;\n\n    /// <summary>\n    /// Sets a custom <see cref=\"CompositionVisual\"/> as the last child of the element’s visual tree.\n    /// </summary>\n    public static void SetElementChildVisual(Visual visual, CompositionVisual? compositionVisual)\n    {\n        if (compositionVisual != null && visual.CompositionVisual != null &&\n            compositionVisual.Compositor != visual.CompositionVisual.Compositor)\n            throw new InvalidOperationException(\"Composition visuals belong to different compositor instances\");\n        \n        visual.ChildCompositionVisual = compositionVisual;\n        visual.GetPresentationSource()?.Renderer.RecalculateChildren(visual);\n    }\n\n    /// <summary>\n    /// Retrieves a <see cref=\"CompositionVisual\"/> object previously set by a call to <see cref=\"SetElementChildVisual\" />.\n    /// </summary>\n    public static CompositionVisual? GetElementChildVisual(Visual visual) => visual.ChildCompositionVisual;\n}\n","sourceCodeStart":7,"sourceCodeEnd":36,"githubUrl":"https://github.com/AvaloniaUI/Avalonia/blob/11c542726898ae954a1ef668c65ec79ec92ab17d/src/Avalonia.Base/Rendering/Composition/ElementCompositionPreview.cs#L7-L36","documentation":"ElementComposition.SetElementChildVisual attaches a custom CompositionVisual as the last child of a Visual's visual tree; it rejects the operation when the supplied visual's Compositor differs from the element's own composition visual's Compositor, because mixing visuals from different compositor instances breaks the single-render-loop invariant.","triggerScenarios":"Calling SetElementChildVisual(hostVisual, childVisual) where childVisual.Compositor != hostVisual.CompositionVisual.Compositor (e.g. the child was created via a Compositor from a different window).","commonSituations":"Creating a CompositionVisual on one window's Compositor and attaching it under a control hosted in another window; sharing composition visuals across surfaces with separate compositors.","solutions":["Create the child CompositionVisual using the same Compositor as the host element (obtain via ElementComposition.GetElementVisual(host)?.Compositor or the element's renderer).","Before attaching, assert childVisual.Compositor == hostVisual.CompositionVisual.Compositor.","Do not cache and reuse CompositionVisuals across windows with distinct compositors."],"exampleFix":"// before\nvar child = otherCompositor.CreateSpriteVisual();\nElementComposition.SetElementChildVisual(host, child); // different compositor -> throws\n\n// after\nvar compositor = ElementComposition.GetElementVisual(host)!.Compositor;\nvar child = compositor.CreateSpriteVisual();\nElementComposition.SetElementChildVisual(host, child);","handlingStrategy":"validation","validationCode":"var compositor = ElementComposition.GetElementVisual(host)?.Compositor;\nif (compositionVisual != null && compositionVisual.Compositor != compositor)\n    throw new InvalidOperationException(\"child visual must use the host's compositor\");\nElementComposition.SetElementChildVisual(host, compositionVisual);","typeGuard":"static bool UsesSameCompositor(Visual host, CompositionVisual child) =>\n    host.CompositionVisual?.Compositor == child.Compositor;","tryCatchPattern":null,"preventionTips":["Create child visuals with the host element's Compositor.","Do not reuse CompositionVisuals across windows with distinct compositors.","Assert compositor equality before SetElementChildVisual."],"tags":["composition","compositor","cross-compositor","visual-tree"],"backgroundTag":null,"analyzedSha":"11c542726898ae954a1ef668c65ec79ec92ab17d","analyzedAt":"2026-08-13T11:57:40.261Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}