{"record":{"id":"8eb601499e506fda","repo":"AvaloniaUI/Avalonia","slug":"controls-for-pageslide-must-have-same-parent","errorCode":null,"errorMessage":"Controls for PageSlide must have same parent.","messagePattern":"Controls for PageSlide must have same parent\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"samples/ControlCatalog/ViewModels/TransitioningContentControlPageViewModel.cs","lineNumber":311,"sourceCode":"        /// Gets the common visual parent of the two control.\n        /// </summary>\n        /// <param name=\"from\">The from control.</param>\n        /// <param name=\"to\">The to control.</param>\n        /// <returns>The common parent.</returns>\n        /// <exception cref=\"ArgumentException\">\n        /// The two controls do not share a common parent.\n        /// </exception>\n        /// <remarks>\n        /// Any one of the parameters may be null, but not both.\n        /// </remarks>\n        private static Visual GetVisualParent(Visual? from, Visual? to)\n        {\n            var p1 = (from ?? to)!.GetVisualParent();\n            var p2 = (to ?? from)!.GetVisualParent();\n\n            if (p1 != null && p2 != null && p1 != p2)\n            {\n                throw new ArgumentException(\"Controls for PageSlide must have same parent.\");\n            }\n\n            return p1 ?? throw new InvalidOperationException(\"Cannot determine visual parent.\");\n        }\n    }\n}\n","sourceCodeStart":293,"sourceCodeEnd":318,"githubUrl":"https://github.com/AvaloniaUI/Avalonia/blob/11c542726898ae954a1ef668c65ec79ec92ab17d/samples/ControlCatalog/ViewModels/TransitioningContentControlPageViewModel.cs#L293-L318","documentation":"Thrown by TransitioningContentControlPageViewModel.GetVisualParent (ArgumentException) when the two controls' visual parents both exist but are different objects. A PageSlide transition needs both the outgoing and incoming content under the same parent to animate a slide.","triggerScenarios":"Calling GetVisualParent(from, to) where p1 = from's parent and p2 = to's parent are both non-null and not equal. The controls are hosted in different containers at transition time.","commonSituations":"TransitioningContentControl misconfigured with content in separate panels; reparenting during a page change; custom transition hosting that splits the two visuals across panels.","solutions":["Host both 'from' and 'to' content in the same parent container.","Ensure the TransitioningContentControl owns both visuals before the transition runs.","Pass a single non-null argument (the other null) when only one side is available, which skips the parent-mismatch check."],"exampleFix":"// before\nvar parent = GetVisualParent(from, to); // different parents -> throws\n\n// after\n// ensure both share TransitioningContentControl's content host\nsameParent.Children.Add(to);\nvar parent = GetVisualParent(from, to);","handlingStrategy":"validation","validationCode":"var p1 = (from ?? to)?.GetVisualParent();\nvar p2 = (to ?? from)?.GetVisualParent();\nif (p1 != null && p2 != null && p1 != p2) { /* host both under the same parent */ }","typeGuard":"static bool SameOrSingleParent(Visual? a, Visual? b) {\n  var pa = a?.GetVisualParent(); var pb = b?.GetVisualParent();\n  return pa == null || pb == null || pa == pb;\n}","tryCatchPattern":"try { var p = GetVisualParent(from, to); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"same parent\")) { /* reparent and retry */ }","preventionTips":["Keep both transitioned controls under the TransitioningContentControl host.","Pass one null argument when only one side is present.","Avoid reparenting during an active transition."],"tags":["sample","transition","visual-tree","csharp","argument"],"backgroundTag":null,"analyzedSha":"11c542726898ae954a1ef668c65ec79ec92ab17d","analyzedAt":"2026-08-13T11:57:40.261Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}