UWP 中的最小窗口大小

10

在我的UWP应用程序中,我想设置一个最小的窗口大小,以便窗口不能被缩小到那个大小以下。

在我搜索过的所有地方中,似乎使用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 启动,但我可以将窗口缩小到我为应用程序设置的 800 x 600 的限制以下。

如何正确地限制窗口大小,使其不能缩小到某个尺寸以下?

3个回答

12

SetPreferredMinSize 是正确的API,但有两个重要注意事项:

  • 首先,请记住,CoreWindow的API在DIPS(设备独立像素空间)中操作,而不是“真实像素”。如果您想设置最小尺寸为320 x 200像素,则需要确保按当前DPI值缩放这些值。

  • 其次,在UWP中,您确实没有对表示窗口大小的硬控制,而只能表达一个偏好。无法实现800 x 600的原因是“最大最小”尺寸实际上是500 x 500像素。请参见MSDN

在我的Direct3D VS游戏模板中,我将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);

你是对的。我没有注意到备注栏,那里清楚地说明了最大最小尺寸为500x500。 - Meisam Seyed Aliroteh

1
在 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;
}

0

对我来说,@IQ.feature 的解决方案有效。但是我已经更改了这一行:

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

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

因为当您尝试调整窗口大小时:

  1. 会调用CoreWindow_SizeChanged方法
  2. 如果用户朝错误的方向移动几个像素,则结果为false,窗口将被卡住。

这为“机动”增加了一些余地。我希望这有意义,因为它对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接