{"record":{"id":"94097481db2b6605","repo":"dotnet/maui","slug":"renderer-s-container-element-must-be-a-panel","errorCode":null,"errorMessage":"Renderer's container element must be a Panel","messagePattern":"Renderer's container element must be a Panel","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Compatibility/Core/src/Windows/VisualElementPackager.cs","lineNumber":30,"sourceCode":"\t\treadonly int _columnSpan;\n\n\t\treadonly Panel _panel;\n\t\treadonly IVisualElementRenderer _renderer;\n\t\treadonly int _row;\n\t\treadonly int _rowSpan;\n\t\tbool _disposed;\n\t\tbool _isLoaded;\n\n\t\tpublic VisualElementPackager(IVisualElementRenderer renderer)\n\t\t{\n\t\t\tif (renderer == null)\n\t\t\t\tthrow new ArgumentNullException(\"renderer\");\n\n\t\t\t_renderer = renderer;\n\n\t\t\t_panel = renderer.ContainerElement as Panel;\n\t\t\tif (_panel == null)\n\t\t\t\tthrow new ArgumentException(\"Renderer's container element must be a Panel\");\n\t\t}\n\n\t\tpublic VisualElementPackager(IVisualElementRenderer renderer, int row = 0, int rowSpan = 0, int column = 0, int columnSpan = 0) : this(renderer)\n\t\t{\n\t\t\t_row = row;\n\t\t\t_rowSpan = rowSpan;\n\t\t\t_column = column;\n\t\t\t_columnSpan = columnSpan;\n\t\t}\n\n\t\tIElementController ElementController => _renderer.Element as IElementController;\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tDispose(true);\n\t\t\tGC.SuppressFinalize(this);\n\t\t}\n","sourceCodeStart":12,"sourceCodeEnd":48,"githubUrl":"https://github.com/dotnet/maui/blob/f377ff1c5ee04d334d8a925f50c83a6b7afddf03/src/Compatibility/Core/src/Windows/VisualElementPackager.cs#L12-L48","documentation":"VisualElementPackager constructor throws ArgumentException when renderer.ContainerElement is not a WinUI Panel. The packager adds child elements to the container's Children collection, which only exists on Panel-derived types (Grid, StackPanel, Canvas, etc.). Non-Panel containers like ContentControl or Border lack the Children collection.","triggerScenarios":"Constructing a VisualElementPackager with a renderer whose ContainerElement is a non-Panel type — e.g. a custom renderer that wraps its content in a Border, ContentControl, or UserControl rather than a Grid.","commonSituations":"Custom renderer overriding ContainerElement to return a non-Panel element; renderer that uses ContentControl.Content instead of Panel.Children for layout; incorrect base class choice for custom renderer.","solutions":["Override ContainerElement in the custom renderer to return a Panel-derived type (Grid is the most common choice)","Use a base renderer class (like ViewRenderer<TElement,TNative>) that already provides a Panel container","If the native control must be non-Panel, wrap it in a Grid and return the Grid as ContainerElement"],"exampleFix":"// before\npublic class MyRenderer : VisualElementRenderer<MyView, Border>\n{\n    // ContainerElement is Border — VisualElementPackager throws\n}\n\n// after\npublic class MyRenderer : VisualElementRenderer<MyView>\n{\n    Grid _panel;\n    public override UIElement ContainerElement => _panel ?? (_panel = new Grid());\n    // VisualElementPackager now works — _panel is a Panel","handlingStrategy":"type-guard","validationCode":"// Before constructing VisualElementPackager, verify ContainerElement is a Panel\nif (renderer.ContainerElement is not Panel)\n    throw new ArgumentException($\"ContainerElement must be a Panel, got {renderer.ContainerElement?.GetType().Name}\");\nvar packager = new VisualElementPackager(renderer);","typeGuard":"static bool HasPanelContainer(IVisualElementRenderer renderer)\n{\n    return renderer?.ContainerElement is Panel;\n}","tryCatchPattern":null,"preventionTips":["Override ContainerElement to return a Grid or other Panel-derived type in custom renderers","Use ViewRenderer<TElement,TNative> base class which provides a Panel container","Verify ContainerElement type in renderer unit tests"],"tags":["rendering","type-mismatch","layout","winui","panel"],"backgroundTag":null,"analyzedSha":"f377ff1c5ee04d334d8a925f50c83a6b7afddf03","analyzedAt":"2026-08-13T14:26:18.069Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}