From 52865054be491e9bee548f2e94ea8c9ae0cde4f0 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 16 Feb 2026 01:00:01 +0500 Subject: [PATCH] Updated more XxxRoot usages --- src/Avalonia.Controls/IMenu.cs | 2 +- src/Avalonia.Controls/MenuBase.cs | 2 +- .../Platform/DefaultMenuInteractionHandler.cs | 2 +- .../Remote/Server/RemoteServerTopLevelImpl.cs | 2 +- src/Avalonia.X11/X11Window.cs | 4 +++- tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs | 2 +- tests/Avalonia.Controls.UnitTests/ToolTipTests.cs | 4 ++-- 7 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Controls/IMenu.cs b/src/Avalonia.Controls/IMenu.cs index 937f135e90..426955b682 100644 --- a/src/Avalonia.Controls/IMenu.cs +++ b/src/Avalonia.Controls/IMenu.cs @@ -23,6 +23,6 @@ namespace Avalonia.Controls /// /// Gets the root of the visual tree, if the control is attached to a visual tree. /// - TopLevel? VisualRoot { get; } + TopLevel? TopLevel { get; } } } diff --git a/src/Avalonia.Controls/MenuBase.cs b/src/Avalonia.Controls/MenuBase.cs index 337128fcd1..bde5bb17de 100644 --- a/src/Avalonia.Controls/MenuBase.cs +++ b/src/Avalonia.Controls/MenuBase.cs @@ -75,7 +75,7 @@ namespace Avalonia.Controls /// IMenuInteractionHandler IMenu.InteractionHandler => InteractionHandler; - TopLevel? IMenu.VisualRoot => TopLevel.GetTopLevel(this); + TopLevel? IMenu.TopLevel => TopLevel.GetTopLevel(this); /// IMenuItem? IMenuElement.SelectedItem diff --git a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs index a15a9e2df1..f8d8c43d3c 100644 --- a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs +++ b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs @@ -300,7 +300,7 @@ namespace Avalonia.Controls.Platform Menu.AddHandler(MenuItem.PointerExitedItemEvent, PointerExited); Menu.AddHandler(InputElement.PointerMovedEvent, PointerMoved); - _root = Menu.VisualRoot; + _root = Menu.TopLevel; if (_root is not null) { diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs index f2fef55d28..b7d6ab4ce5 100644 --- a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -265,7 +265,7 @@ namespace Avalonia.Controls.Remote.Server protected virtual Size Measure(Size constraint) { - var l = (Layoutable) InputRoot!; + var l = (Layoutable)InputRoot!.RootElement!; l.Measure(constraint); return l.DesiredSize; } diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index c931b1a6fb..602381d7c9 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -267,7 +267,9 @@ namespace Avalonia.X11 ? DBusSystemDialog.TryCreateAsync(Handle) : Task.FromResult(null), () => GtkSystemDialog.TryCreate(this), - () => Task.FromResult(InputRoot is TopLevel tl + // TODO: This will be incompatible with "root element is not a TopLevel" scenarios, + // we should probably have a separate API for this + () => Task.FromResult(InputRoot.RootElement is TopLevel tl ? (IStorageProvider?)new ManagedStorageProvider(tl) : null) }); diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs index 52caba2a6f..122f867db8 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs @@ -1170,7 +1170,7 @@ namespace Avalonia.Controls.UnitTests.Primitives var ev = new PointerPressedEventArgs( popupContent, pointer, - (PopupRoot)popupContent.VisualRoot!, + (PopupRoot)TopLevel.GetTopLevel(popupContent)!, new Point(50 , 50), 0, new PointerPointProperties(RawInputModifiers.None, PointerUpdateKind.LeftButtonPressed), diff --git a/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs b/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs index 0e4a75f521..721876312c 100644 --- a/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs @@ -38,7 +38,7 @@ namespace Avalonia.Controls.UnitTests { _toolTipOpenSubscription = ToolTip.IsOpenProperty.Changed.Subscribe(new AnonymousObserver>(e => { - if (e.Sender is Visual { VisualRoot: TopLevel {} root } visual) + if (e.Sender is Visual visual && TopLevel.GetTopLevel(visual) is {} root) OverlayLayer.GetOverlayLayer(visual)?.Measure(root.ClientSize); })); } @@ -577,7 +577,7 @@ namespace Avalonia.Controls.UnitTests hitTesterMock.Setup(m => m.HitTestFirst(point, window, It.IsAny>())) .Returns(control); - var root = (IInputRoot?)control?.VisualRoot?.PresentationSource ?? window.InputRoot; + var root = control?.GetInputRoot() ?? window.InputRoot; var timestamp = (ulong)DateTime.Now.Ticks; windowImpl.Object.Input!(new RawPointerEventArgs(s_mouseDevice, timestamp, root,