Explorar el Código

Merge pull request #9973 from AvaloniaUI/toplevel

Add TopLevel.GetTopLevel api
Max Katz hace 2 años
padre
commit
7513cca0bd

+ 2 - 2
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()
         {

+ 1 - 1
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));
         }
     }
 }

+ 1 - 1
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) =>

+ 1 - 1
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);
             

+ 1 - 1
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)
             {

+ 10 - 0
src/Avalonia.Controls/TopLevel.cs

@@ -341,6 +341,16 @@ namespace Avalonia.Controls
         {
             return PlatformImpl?.PointToScreen(p) ?? default;
         }
+
+        /// <summary>
+        /// Gets the <see cref="TopLevel" /> for which the given <see cref="Visual"/> is hosted in.
+        /// </summary>
+        /// <param name="visual">The visual to query its TopLevel</param>
+        /// <returns>The TopLevel</returns>
+        public static TopLevel? GetTopLevel(Visual? visual)
+        {
+            return visual == null ? null : visual.VisualRoot as TopLevel;
+        }
         
         /// <summary>
         /// Creates the layout manager for this <see cref="TopLevel" />.

+ 1 - 2
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

+ 1 - 2
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)