UWP 中的最小 Window 大小

Min Window Size in UWP

在我的 UWP 应用程序中,我想设置一个最小 window 大小,这样 window 就不能小于该大小。

在我搜索的所有地方,似乎使用 ApplicationView.PreferredLaunchViewSize 是可行的方法,但由于某种原因,这在我的应用程序中不起作用。

我创建了一个空白的 UWP 应用程序并更新了 OnLaunched 方法,如下所示:

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    ApplicationView.PreferredLaunchViewSize = new Size(1200, 900);
    ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize;
    ApplicationView.GetForCurrentView().SetPreferredMinSize(new Size(800, 600));

    ...
}

我的应用程序以 1200 x 900 的正确大小启动,但我可以将 window 缩小到小于我为应用程序设置的限制 800 x 600。

限制 window 尺寸使其不能小于特定尺寸的正确方法是什么?

SetPreferredMinSize 是正确的 API,但有两个重要的警告:

  • 首先,请记住 CoreWindow 的 APIs 在 DIPS(设备独立像素 Space)中运行,而不是 'true pixels'。如果你想设置至少 320 x 200 像素,那么你需要确保按当前 DPI 值缩放值。

  • 其次,在 UWP 中,您确实无法硬性控制显示 window 大小,只能表达偏好。无法使用 800 x 600 的原因是 'maximum minimum' 大小实际上是 500 x 500 像素。见 MSDN.

在我的 Direct3D VS Game templates 中,我使用 320 x 200 作为最小尺寸:

C++/CX

auto minSize = Size(ConvertPixelsToDips(320), ConvertPixelsToDips(200));
view->SetPreferredMinSize(minSize);

C++/WinRT

auto minSize = Size(ConvertPixelsToDips(320), ConvertPixelsToDips(200));
view.SetPreferredMinSize(minSize);

添加到App.xaml代码:

private readonly double minW = 800, minH = 600;

protected override void OnWindowCreated(WindowCreatedEventArgs args) {
    SetWindowMinSize(new Size(args.Window.Bounds.Width, args.Window.Bounds.Height));
    args.Window.CoreWindow.SizeChanged += CoreWindow_SizeChanged;
    base.OnWindowCreated(args);
}

private void CoreWindow_SizeChanged(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.WindowSizeChangedEventArgs args) {
    if (SetWindowMinSize(args.Size)) sender.ReleasePointerCapture();
}

private bool SetWindowMinSize(Size size) {
    if (size.Width < minW || size.Height < minH) {
        if (size.Width < minW) size.Width = minW;
        if (size.Height < minH) size.Height = minH;
        return ApplicationView.GetForCurrentView().TryResizeView(size);
    }
    return false;
}

对我来说,@IQ.feature 解决了这个问题。但我已经更改了行:

if (size.Width < minWidth) size.Width = minWidth

if (size.Width < minWidth) size.Width = minWidth + 10;

因为当您尝试调整 windows 的大小时:

  1. 调用方法CoreWindow_SizeChanged
  2. 如果用户在几像素内走错方向事件,则结果为假,window 卡住。

这为“机动”增加了一点回旋余地。我希望它有意义,因为它对我有用