提交 7dc99f2b 编写于 作者: M Martin Zikmund

fix: Popup and Flyout placement within Islands

上级 6998e428
......@@ -15,6 +15,7 @@ using Windows.UI.Core;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Media;
using WinUICoreServices = Uno.UI.Xaml.Core.CoreServices;
#if XAMARIN_IOS
using View = UIKit.UIView;
......@@ -328,7 +329,16 @@ namespace Windows.UI.Xaml.Controls.Primitives
throw new ArgumentException("Invalid flyout position");
}
var visibleBounds = ApplicationView.GetForCurrentView().VisibleBounds;
Rect visibleBounds;
if (WinUICoreServices.Instance.InitializationType == Uno.UI.Xaml.Core.InitializationType.IslandsOnly)
{
var xamlRoot = XamlRoot ?? placementTarget?.XamlRoot;
visibleBounds = xamlRoot.Bounds;
}
else
{
visibleBounds = ApplicationView.GetForCurrentView().VisibleBounds;
}
positionValue = new Point(
positionValue.X.Clamp(visibleBounds.Left, visibleBounds.Right),
positionValue.Y.Clamp(visibleBounds.Top, visibleBounds.Bottom));
......@@ -517,6 +527,12 @@ namespace Windows.UI.Xaml.Controls.Primitives
{
// UNO TODO: UWP also uses values coming from the input pane and app bars, if any.
// Make sure of migrate to XamlRoot: https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.xamlroot
if (WinUICoreServices.Instance.InitializationType == Uno.UI.Xaml.Core.InitializationType.IslandsOnly)
{
var xamlRoot = popup.XamlRoot ?? popup.Child?.XamlRoot;
return xamlRoot.Bounds;
}
return ApplicationView.GetForCurrentView().VisibleBounds;
}
......
......@@ -5,6 +5,7 @@ using Windows.UI.ViewManagement;
using Uno.UI;
using Uno.Foundation.Logging;
using System.Linq;
using WinUICoreServices = Uno.UI.Xaml.Core.CoreServices;
#if HAS_UNO_WINUI
......@@ -91,7 +92,7 @@ partial class PopupPanel
if (Flyout?.IsTargetPositionSet ?? false)
{
rect = Flyout.UpdateTargetPosition(ApplicationView.GetForCurrentView().VisibleBounds, desiredSize, rect);
rect = Flyout.UpdateTargetPosition(GetVisibleBounds(), desiredSize, rect);
}
child.Arrange(rect);
......@@ -116,7 +117,7 @@ partial class PopupPanel
{
var anchorRect = GetAnchorRect(popup);
var visibleBounds = ApplicationView.GetForCurrentView().VisibleBounds;
var visibleBounds = GetVisibleBounds();
// Make sure the desiredSize fits in the panel
desiredSize.Width = Math.Min(desiredSize.Width, visibleBounds.Width);
......@@ -376,4 +377,8 @@ partial class PopupPanel
return fits;
}
private Rect GetVisibleBounds() =>
WinUICoreServices.Instance.InitializationType == Uno.UI.Xaml.Core.InitializationType.IslandsOnly ?
XamlRoot.Bounds : ApplicationView.GetForCurrentView().VisibleBounds;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册