diff --git a/samples/ControlCatalog/MainView.xaml.cs b/samples/ControlCatalog/MainView.xaml.cs
index ae8be8cfc6..a6274b56e7 100644
--- a/samples/ControlCatalog/MainView.xaml.cs
+++ b/samples/ControlCatalog/MainView.xaml.cs
@@ -45,7 +45,7 @@ namespace ControlCatalog
private void Decorations_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
- if (VisualRoot is Window window && e.AddedItems.Count > 0 && e.AddedItems[0] is SystemDecorations systemDecorations)
+ if (TopLevel.GetTopLevel(this) is Window window && e.AddedItems.Count > 0 && e.AddedItems[0] is SystemDecorations systemDecorations)
{
window.SystemDecorations = systemDecorations;
}
@@ -78,7 +78,7 @@ namespace ControlCatalog
{
base.OnAttachedToVisualTree(e);
- if (VisualRoot is Window window)
+ if (TopLevel.GetTopLevel(this) is Window window)
Decorations.SelectedIndex = (int)window.SystemDecorations;
var insets = TopLevel.GetTopLevel(this)!.InsetsManager;
diff --git a/src/Avalonia.Base/Visual.cs b/src/Avalonia.Base/Visual.cs
index 98084d6d75..95d55754d3 100644
--- a/src/Avalonia.Base/Visual.cs
+++ b/src/Avalonia.Base/Visual.cs
@@ -368,7 +368,7 @@ namespace Avalonia
///
/// Gets a value indicating whether this control is attached to a visual root.
///
- internal bool IsAttachedToVisualTree => VisualRoot != null;
+ internal bool IsAttachedToVisualTree => this.PresentationSource != null;
///
/// Gets the control's parent visual.
diff --git a/src/Avalonia.Controls/Chrome/TitleBar.cs b/src/Avalonia.Controls/Chrome/TitleBar.cs
index 5eb65d3396..430a8d4eaf 100644
--- a/src/Avalonia.Controls/Chrome/TitleBar.cs
+++ b/src/Avalonia.Controls/Chrome/TitleBar.cs
@@ -54,7 +54,7 @@ namespace Avalonia.Controls.Chrome
_captionButtons = e.NameScope.Get("PART_CaptionButtons");
- if (VisualRoot is Window window)
+ if (TopLevel.GetTopLevel(this) is Window window)
{
_captionButtons?.Attach(window);
@@ -67,7 +67,7 @@ namespace Avalonia.Controls.Chrome
{
base.OnAttachedToVisualTree(e);
- if (VisualRoot is Window window)
+ if (TopLevel.GetTopLevel(this) is Window window)
{
_disposables = new CompositeDisposable(6)
{
diff --git a/src/Avalonia.Controls/NativeMenuBar.cs b/src/Avalonia.Controls/NativeMenuBar.cs
index 2f271ef34c..0df5b1df07 100644
--- a/src/Avalonia.Controls/NativeMenuBar.cs
+++ b/src/Avalonia.Controls/NativeMenuBar.cs
@@ -34,7 +34,7 @@ namespace Avalonia.Controls
?? this.FindDescendantOfType()
?? throw new InvalidOperationException("NativeMenuBar requires a MenuBase#PART_NativeMenuPresenter template part.");
- if (VisualRoot is TopLevel topLevel)
+ if (TopLevel.GetTopLevel(this) is {} topLevel)
{
SubscribeToToplevel(topLevel, _menu);
}
diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs
index 76fa73f4c3..2dd620094a 100644
--- a/src/Avalonia.Controls/Primitives/Popup.cs
+++ b/src/Avalonia.Controls/Primitives/Popup.cs
@@ -676,7 +676,7 @@ namespace Avalonia.Controls.Primitives
{
var newTarget = change.GetNewValue() ?? this.FindLogicalAncestorOfType();
- if (newTarget is null || newTarget.GetVisualRoot() != _openState.TopLevel)
+ if (newTarget is null || TopLevel.GetTopLevel(newTarget) != _openState.TopLevel)
{
Close();
return;
diff --git a/src/Avalonia.Controls/Primitives/PopupPositioning/IPopupPositioner.cs b/src/Avalonia.Controls/Primitives/PopupPositioning/IPopupPositioner.cs
index 82dead1ed5..67818e68f5 100644
--- a/src/Avalonia.Controls/Primitives/PopupPositioning/IPopupPositioner.cs
+++ b/src/Avalonia.Controls/Primitives/PopupPositioning/IPopupPositioner.cs
@@ -582,7 +582,7 @@ namespace Avalonia.Controls.Primitives.PopupPositioning
if (matrix == null)
{
- if (target.GetVisualRoot() == null)
+ if (!target.IsAttachedToVisualTree)
throw new InvalidOperationException("Target control is not attached to the visual tree");
throw new InvalidOperationException("Target control is not in the same tree as the popup parent");
}
diff --git a/src/Avalonia.X11/X11WindowModes/XEmbedClientWindowMode.cs b/src/Avalonia.X11/X11WindowModes/XEmbedClientWindowMode.cs
index 89ceec5813..8798ac8172 100644
--- a/src/Avalonia.X11/X11WindowModes/XEmbedClientWindowMode.cs
+++ b/src/Avalonia.X11/X11WindowModes/XEmbedClientWindowMode.cs
@@ -79,7 +79,7 @@ partial class X11Window
if (args.PropertyName == nameof(KeyboardDevice.Instance.FocusedElement))
{
if (KeyboardDevice.Instance.FocusedElement is Visual visual
- && visual.VisualRoot is EmbeddableControlRoot root
+ && TopLevel.GetTopLevel(visual) is EmbeddableControlRoot root
&& root.PlatformImpl is X11Window window
&& window._mode is XEmbedClientWindowMode xembedMode
&& xembedMode._currentEmbedder != IntPtr.Zero)