From 1c41ef76b59b31679568d679c141bf80c2901871 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 16 Feb 2026 00:26:57 +0500 Subject: [PATCH] Updated some VisualRoot / GetVisualRoot usages --- samples/ControlCatalog/MainView.xaml.cs | 4 ++-- src/Avalonia.Base/Visual.cs | 2 +- src/Avalonia.Controls/Chrome/TitleBar.cs | 4 ++-- src/Avalonia.Controls/NativeMenuBar.cs | 2 +- src/Avalonia.Controls/Primitives/Popup.cs | 2 +- .../Primitives/PopupPositioning/IPopupPositioner.cs | 2 +- src/Avalonia.X11/X11WindowModes/XEmbedClientWindowMode.cs | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) 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)