diff --git a/samples/ControlCatalog/Pages/DialogsPage.xaml.cs b/samples/ControlCatalog/Pages/DialogsPage.xaml.cs
index 67e9ef4e40..8db6e76dca 100644
--- a/samples/ControlCatalog/Pages/DialogsPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/DialogsPage.xaml.cs
@@ -396,8 +396,8 @@ CanPickFolder: {storageProvider.CanPickFolder}";
return item.TryGetUri(out var uri) ? uri.ToString() : item.Name;
}
- Window GetWindow() => this.VisualRoot as Window ?? throw new NullReferenceException("Invalid Owner");
- TopLevel GetTopLevel() => this.VisualRoot as TopLevel ?? throw new NullReferenceException("Invalid Owner");
+ Window GetWindow() => TopLevel.GetTopLevel(this) as Window ?? throw new NullReferenceException("Invalid Owner");
+ TopLevel GetTopLevel() => TopLevel.GetTopLevel(this) ?? throw new NullReferenceException("Invalid Owner");
private void InitializeComponent()
{
diff --git a/samples/ControlCatalog/Pages/NotificationsPage.xaml.cs b/samples/ControlCatalog/Pages/NotificationsPage.xaml.cs
index bfd49a2c00..6f83e5c366 100644
--- a/samples/ControlCatalog/Pages/NotificationsPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/NotificationsPage.xaml.cs
@@ -27,7 +27,7 @@ namespace ControlCatalog.Pages
{
base.OnAttachedToVisualTree(e);
- _viewModel.NotificationManager = new Avalonia.Controls.Notifications.WindowNotificationManager(VisualRoot as TopLevel);
+ _viewModel.NotificationManager = new Avalonia.Controls.Notifications.WindowNotificationManager(TopLevel.GetTopLevel(this));
}
}
}
diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs
index 8da99b5f25..6018779e34 100644
--- a/src/Avalonia.Controls/ComboBox.cs
+++ b/src/Avalonia.Controls/ComboBox.cs
@@ -383,7 +383,7 @@ namespace Avalonia.Controls
_subscriptionsOnOpen.Clear();
- var toplevel = this.GetVisualRoot() as TopLevel;
+ var toplevel = TopLevel.GetTopLevel(this);
if (toplevel != null)
{
toplevel.AddDisposableHandler(PointerWheelChangedEvent, (s, ev) =>
diff --git a/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs b/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs
index e0f72cae54..e265f4eb6a 100644
--- a/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs
+++ b/src/Avalonia.Controls/Primitives/OverlayPopupHost.cs
@@ -123,7 +123,7 @@ namespace Avalonia.Controls.Primitives
public static IPopupHost CreatePopupHost(Visual target, IAvaloniaDependencyResolver? dependencyResolver)
{
- var platform = (target.GetVisualRoot() as TopLevel)?.PlatformImpl?.CreatePopup();
+ var platform = TopLevel.GetTopLevel(target)?.PlatformImpl?.CreatePopup();
if (platform != null)
return new PopupRoot((TopLevel)target.GetVisualRoot()!, platform, dependencyResolver);
diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs
index bf79198939..7cac12eabe 100644
--- a/src/Avalonia.Controls/Primitives/Popup.cs
+++ b/src/Avalonia.Controls/Primitives/Popup.cs
@@ -358,7 +358,7 @@ namespace Avalonia.Controls.Primitives
return;
}
- var topLevel = placementTarget.VisualRoot as TopLevel;
+ var topLevel = TopLevel.GetTopLevel(placementTarget);
if (topLevel == null)
{
diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs
index 1f5b8f80d2..9970a0f1c7 100644
--- a/src/Avalonia.Controls/TopLevel.cs
+++ b/src/Avalonia.Controls/TopLevel.cs
@@ -341,6 +341,16 @@ namespace Avalonia.Controls
{
return PlatformImpl?.PointToScreen(p) ?? default;
}
+
+ ///
+ /// Gets the for which the given is hosted in.
+ ///
+ /// The visual to query its TopLevel
+ /// The TopLevel
+ public static TopLevel? GetTopLevel(Visual? visual)
+ {
+ return visual == null ? null : visual.VisualRoot as TopLevel;
+ }
///
/// Creates the layout manager for this .
diff --git a/src/Avalonia.Native/AvaloniaNativeDragSource.cs b/src/Avalonia.Native/AvaloniaNativeDragSource.cs
index bec45c2d71..7f4c462ee0 100644
--- a/src/Avalonia.Native/AvaloniaNativeDragSource.cs
+++ b/src/Avalonia.Native/AvaloniaNativeDragSource.cs
@@ -6,7 +6,6 @@ using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Interactivity;
using Avalonia.Native.Interop;
-using Avalonia.VisualTree;
namespace Avalonia.Native
{
@@ -26,7 +25,7 @@ namespace Avalonia.Native
if (element == null)
return null;
var visual = (Visual)element;
- return visual.GetVisualRoot() as TopLevel;
+ return TopLevel.GetTopLevel(visual);
}
class DndCallback : NativeCallbackBase, IAvnDndResultCallback
diff --git a/src/Windows/Avalonia.Win32/Input/WindowsMouseDevice.cs b/src/Windows/Avalonia.Win32/Input/WindowsMouseDevice.cs
index cf1bdc1671..998ff4a427 100644
--- a/src/Windows/Avalonia.Win32/Input/WindowsMouseDevice.cs
+++ b/src/Windows/Avalonia.Win32/Input/WindowsMouseDevice.cs
@@ -1,7 +1,6 @@
using System;
using Avalonia.Controls;
using Avalonia.Input;
-using Avalonia.VisualTree;
using Avalonia.Win32.Interop;
namespace Avalonia.Win32.Input
@@ -34,7 +33,7 @@ namespace Avalonia.Win32.Input
protected override void PlatformCapture(IInputElement element)
{
- var hwnd = (((element as Visual)?.GetVisualRoot() as TopLevel)?.PlatformImpl as WindowImpl)
+ var hwnd = (TopLevel.GetTopLevel(element as Visual)?.PlatformImpl as WindowImpl)
?.Handle.Handle;
if (hwnd.HasValue && hwnd != IntPtr.Zero)