AvaloniaUI/Avalonia · error · ArgumentException
Controls for PageSlide must have same parent.
Error message
Controls for PageSlide must have same parent.
What it means
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.
Source
Thrown at samples/ControlCatalog/ViewModels/TransitioningContentControlPageViewModel.cs:311
/// Gets the common visual parent of the two control.
/// </summary>
/// <param name="from">The from control.</param>
/// <param name="to">The to control.</param>
/// <returns>The common parent.</returns>
/// <exception cref="ArgumentException">
/// The two controls do not share a common parent.
/// </exception>
/// <remarks>
/// Any one of the parameters may be null, but not both.
/// </remarks>
private static Visual GetVisualParent(Visual? from, Visual? to)
{
var p1 = (from ?? to)!.GetVisualParent();
var p2 = (to ?? from)!.GetVisualParent();
if (p1 != null && p2 != null && p1 != p2)
{
throw new ArgumentException("Controls for PageSlide must have same parent.");
}
return p1 ?? throw new InvalidOperationException("Cannot determine visual parent.");
}
}
}
View on GitHub (pinned to 11c5427268)
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.
Example fix
// before var parent = GetVisualParent(from, to); // different parents -> throws // after // ensure both share TransitioningContentControl's content host sameParent.Children.Add(to); var parent = GetVisualParent(from, to);
Defensive patterns
Strategy: validation
Validate before calling
var p1 = (from ?? to)?.GetVisualParent();
var p2 = (to ?? from)?.GetVisualParent();
if (p1 != null && p2 != null && p1 != p2) { /* host both under the same parent */ } Type guard
static bool SameOrSingleParent(Visual? a, Visual? b) {
var pa = a?.GetVisualParent(); var pb = b?.GetVisualParent();
return pa == null || pb == null || pa == pb;
} Try / catch
try { var p = GetVisualParent(from, to); }
catch (ArgumentException ex) when (ex.Message.Contains("same parent")) { /* reparent and retry */ } Prevention
- Keep both transitioned controls under the TransitioningContentControl host.
- Pass one null argument when only one side is present.
- Avoid reparenting during an active transition.
When it happens
Trigger: 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.
Common situations: TransitioningContentControl misconfigured with content in separate panels; reparenting during a page change; custom transition hosting that splits the two visuals across panels.
Related errors
- Transition elements have different parents.
- Cannot determine visual parent.
- Device with the corresponding LUID not found
- Not supported format
- Value must be less than 10.
AI-assisted analysis of AvaloniaUI/Avalonia@11c5427268 (2026-08-13).
Data as JSON: /api/errors/8eb601499e506fda.
Report an issue: GitHub.