为 Windows 10 UWP 应用程序在桌面上设置 window 大小

Setting window size on desktop for a Windows 10 UWP app

我刚刚开始使用 Visual Studio 2015 Community Edition 在 Windows 10 Pro 上学习 UWP 应用程序开发。我试图通过在 MainPage.xaml.

中设置页面标记的 WidthHeight 属性来修改 C# version of the official "Hello, World!" sample

有趣的是,当我启动应用程序时,它的大小会有所不同。此外,如果我调整其 window 的大小然后重新启动它,应用程序似乎会记住其之前的 window 大小。

是否可以强制 UWP 应用具有预定义的 window 大小,至少在台式机上如此?

尝试在 MainPage 构造函数 中设置 PreferredLaunchViewSize,如下所示:

public MainPage()
{
    this.InitializeComponent();

    ApplicationView.PreferredLaunchViewSize = new Size(480, 800);
    ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize;
}

正如@kol 还指出的那样,如果您想要任何小于默认 500x320 的尺寸,您将需要手动重置它:

ApplicationView.GetForCurrentView().SetPreferredMinSize(new Size(200, 100));

您实际上无法控制 window 大小,即使您尝试重新调整它的大小也可能会失败。我在 MSDN 论坛上问过同样的问题并在这里得到了答案:

Windows 10 universal DirectX application

顺便说一句,这是您的事件处理程序 "OnLaunched" 或事件处理程序 "OnActivated" 中的解决方案:

Window.Current.Activate();

并将其替换为:

float DPI = Windows.Graphics.Display.DisplayInformation.GetForCurrentView().LogicalDpi;

Windows.UI.ViewManagement.ApplicationView.PreferredLaunchWindowingMode = Windows.UI.ViewManagement.ApplicationViewWindowingMode.PreferredLaunchViewSize;

var desiredSize = new Windows.Foundation.Size(((float)800 * 96.0f / DPI), ((float)600 * 96.0f / DPI));

Windows.UI.ViewManagement.ApplicationView.PreferredLaunchViewSize = desiredSize;

Window.Current.Activate();

bool result = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().TryResizeView(desiredSize);

最好将此代码放入 "OnActivated()" 事件处理程序中,因为它会在应用程序启动时以及在任何中断后变为活动状态时设置您定义的大小。

在"desiredSize"计算中,宽度为800,高度为600。需要这个计算,因为尺寸是以DPI为单位的,所以你必须把它从像素转换成DPI。

另请注意,尺寸不能小于“320x200”。

对于第一次启动应用程序,无论您在代码中设置什么,ApplicationView.PreferredLaunchWindowingMode 都会设置为 ApplicationViewWindowingMode.Auto

不过,从this question on MSDN开始,可能有办法克服这个问题。其中一个答案提供了一种设置第一个启动大小的方法(之后恢复为 Auto)。

If your goal is to launch only once at a PreferredLaunchViewSize, you can use this rude solution (up to you for a better implementation with your coding style! :P)

public MainPage()
{
    this.InitializeComponent();

    var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
        if (localSettings.Values["launchedWithPrefSize"] == null)
        {
            // first app launch only!!
            ApplicationView.PreferredLaunchViewSize = new Size(100, 100);
            ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize;
            localSettings.Values["launchedWithPrefSize"] = true;
        }
        // resetting the auto-resizing -> next launch the system will control the PreferredLaunchViewSize
        ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.Auto;
    }
}

P.S。我没有测试过这个。

在 Whosebug 的另一个 link 中,还有另一种方法:。这段代码是插入在App.xaml:

    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 < minWidth || size.Height < minHeight)
        {
            if (size.Width < minWidth) size.Width = minWidth + 10;
            if (size.Height < minHeight) size.Height = minHeight + 10;
            return ApplicationView.GetForCurrentView().TryResizeView(size);
        }
        return false;
    }