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 的大小时:
- 调用方法CoreWindow_SizeChanged
- 如果用户在几像素内走错方向事件,则结果为假,window 卡住。
这为“机动”增加了一点回旋余地。我希望它有意义,因为它对我有用
在我的 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 的大小时:
- 调用方法CoreWindow_SizeChanged
- 如果用户在几像素内走错方向事件,则结果为假,window 卡住。
这为“机动”增加了一点回旋余地。我希望它有意义,因为它对我有用