在 UWP 中显示主要 window 的次要 window 中心

Show secondary window center of main window in UWP

我开始在 UWP 中使用多个 windows 并且需要显示次要的 windows 屏幕中心或至少显示父 window 的中心。

除了 Window.Current.Bounds 属性.

之外,我没有发现与如何指定在屏幕上的何处显示其他 windows 相关的内容

这是我用来创建额外 windows 的方法的简化版本。方法签名是:CreateFrameWindow(Size size, Type pageType, object parameter)

CoreApplicationView newWindow = CoreApplication.CreateNewView();

ApplicationView newView = null;
bool result = await newWindow.Dispatcher.TryRunAsync(CoreDispatcherPriority.Normal, () =>
{
    Frame frame = new Frame();
    frame.Navigate(pageType, parameter);
    Window.Current.Content = frame;

    Window.Current.Activate();
    newView = ApplicationView.GetForCurrentView();
});

result = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newView.Id);
newView.TryResizeView(size);

只要辅助 window 有足够的 space 可以根据其在屏幕上的当前位置调整大小,TryResizeView 就可以正常工作。我想启用最大可用大小(最大化时 window 的大小)并将其放置在屏幕中央。如果这是不可能的,放置到父级或主 window 的中心是可以接受的。

Show secondary window center of main window in UWP

CoreApplicationView不提供api手动设置视图位置。根据您的要求,请尝试使用 AppWindow to archive this feature. And AppWindow has RequestMoveRelativeToDisplayRegion method that position the window in the specified display region at the specified offset. For more please refer official code sample 场景 5

更新

如果你想让你的新 window 显示在中心,你需要知道你的 windows 大小,并为 RequestMoveRelativeToDisplayRegion 方法计算 X Y 值。

X = (1920-W)/2  //1920 is Horizontal Resolution W is the new window's width 
Y = (1080-H)/2  //1080 is Vertical Resolution  H is the new window's height

获取当前显示分辨​​率请参考本例

var bounds = ApplicationView.GetForCurrentView().VisibleBounds;
var scaleFactor = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;
var size = new Size(bounds.Width*scaleFactor, bounds.Height*scaleFactor);

对于 AppWindow,我正在使用...

//Set custom window size
Windows.UI.WindowManagement.Preview.WindowManagementPreview.SetPreferredMinSize(appWindow, new Size(500, 500));
appWindow.RequestSize(new Size(500, 500));

DisplayRegion displayRegion = ApplicationView.GetForCurrentView().GetDisplayRegions()[0];
double displayRegionWidth = displayRegion.WorkAreaSize.Width;
double displayRegionHeight = displayRegion.WorkAreaSize.Height;
int horizontalOffset = (int)(displayRegionWidth - 520); //New window is 500 width + 20 to accomodate for padding
int verticalOffset = (int)(displayRegionHeight - 500); //New window is 500 height
appWindow.RequestMoveRelativeToDisplayRegion(displayRegion, new Point(horizontalOffset / 2 , verticalOffset / 2));