{"record":{"id":"c8129a33fb58200f","repo":"stride3d/stride","slug":"uielementtype-is-not-a-descendant-of-uielement","errorCode":null,"errorMessage":"{uiElementType} is not a descendant of UIElement.","messagePattern":"(.+?) is not a descendant of UIElement\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.UI/Renderers/RendererManager.cs","lineNumber":68,"sourceCode":"                    elementRenderer = defaultFactory.TryCreateRenderer(element);\n\n                if (elementRenderer == null)\n                    throw new InvalidOperationException($\"No renderer found for element {element}\");\n\n                // cache the renderer for future uses.\n                elementIdToRenderer[element.Id] = elementRenderer;\n            }\n\n            return elementRenderer;\n        }\n\n        public void RegisterRendererFactory(Type uiElementType, IElementRendererFactory factory)\n        {\n            if (uiElementType == null) throw new ArgumentNullException(nameof(uiElementType));\n            if (factory == null) throw new ArgumentNullException(nameof(factory));\n\n            if (!typeof(UIElement).GetTypeInfo().IsAssignableFrom(uiElementType.GetTypeInfo()))\n                throw new InvalidOperationException(uiElementType + \" is not a descendant of UIElement.\");\n\n            typesToUserFactories[uiElementType] = factory;\n        }\n\n        public void RegisterRenderer(UIElement element, ElementRenderer renderer)\n        {\n            if (element == null) throw new ArgumentNullException(nameof(element));\n            if (renderer == null) throw new ArgumentNullException(nameof(renderer));\n\n            elementIdToRenderer[element.Id] = renderer;\n        }\n\n        public void Dispose()\n        {\n            foreach (var renderer in elementIdToRenderer.Values)\n            {\n                if (!renderer.IsDisposed)\n                    renderer.Dispose();","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.UI/Renderers/RendererManager.cs#L50-L86","documentation":"Thrown by RendererManager.RegisterRendererFactory when the registered uiElementType is not assignable from UIElement (i.e. it is not a UIElement descendant). The renderer lookup walks the element's type hierarchy expecting UIElement-derived types; registering an unrelated type would never match and indicates a caller mistake, so it throws InvalidOperationException naming the offending type.","triggerScenarios":"Thrown at sources/engine/Stride.UI/Renderers/RendererManager.cs:68 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Only pass types that derive (directly or transitively) from Stride.UI.UIElement to RegisterRendererFactory.","If the type comes from reflection, generics or assembly scanning, filter candidates with typeof(UIElement).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo()) before registering.","Fix misconfigured generic type arguments or scanned assemblies so non-UIElement types never reach the registration call."],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}