【问题标题】:Min Window Size in UWPUWP 中的最小窗口大小
【发布时间】:2017-09-19 01:54:14
【问题描述】:

在我的 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 的限制。

限制窗口大小以使其不能小于某个大小的正确方法是什么?

【问题讨论】:

    标签: uwp window size


    【解决方案1】:

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

    • 首先,请记住 CoreWindow 的 API 在 DIPS(设备独立像素空间)中运行,而不是在“真实像素”中运行。如果您想设置至少 320 x 200 像素,那么您需要确保按当前 DPI 值缩放这些值。

    • 其次,在 UWP 中,您确实无法硬控制演示窗口的大小,而只能表达偏好。您无法使用 800 x 600 的原因是“最大最小”尺寸实际上是 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);
    

    【讨论】:

    • 你是对的。我没有注意备注部分,它明确指出最大最小尺寸为 500x500
    【解决方案2】:

    添加到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;
    }
    

    【讨论】:

      【解决方案3】:

      对我来说,@IQ.feature 解决了这个问题。但是我换了行:

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

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

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

      1. 调用CoreWindow_SizeChanged方法
      2. 如果用户在错误的方向事件中走错了几 px,则结果为 false 并且窗口被卡住。

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

      【讨论】:

        猜你喜欢
        • 2020-04-27
        • 1970-01-01
        • 2016-06-08
        • 1970-01-01
        • 2019-03-13
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 2013-10-05
        相关资源
        最近更新 更多