11

所以我正在阅读另一个问题中有人链接到的那些 Windows Vista UI 指南,他们提到你应该能够在切换到 120 DPI 后幸存下来。好吧,我在安装了我的应用程序的情况下启动了我方便的虚拟机,我们得到了什么……啊啊!!!大规模用户界面失败!

一切都乱七八糟:有些容器不够大,无法容纳它们的文字;一些“彼此相邻”定位的控件现在都挤在一起/分开了;有些按钮不够高;我的ListView专栏不够宽... eeek。

这听起来像是一种完全不同的方法。我之前的一个基本上是使用 VS2008 Windows 窗体设计器来创建,我猜是基于像素的布局。我可以看到,如果我坚持使用 Windows 窗体,FlowLayoutPanels 会很有帮助,尽管我过去发现它们相当不灵活。它们也不能解决容器(例如表单本身)不够大的问题;大概有办法做到这一点?也许是那个AutoSize属性?

这也可能表明是时候跳槽到 WPF 了。我的印象是它是专门为这种事情设计的。

基本问题似乎归结为这些:

  • 如果我要坚持使用 Windows 窗体,那么实现与字体大小无关的布局的所有技巧是什么,这种布局可以在用户设置大字体或将显示设置为 120 DPI 时存活下来?
  • WPF 在这方面是否具有显着优势,如果是,您能否尝试说服我值得转换?
  • 在 .NET 堆栈中或一般情况下,是否存在与字体大小无关的布局的一般“最佳实践”?
4

3 回答 3

11

了解AnchorDock属性如何在您的控件上工作,留下任何可以自动调整大小的东西,并尽可能使用TableLayoutPanel

如果你做到了这三件事,你将获得很多 Windows 窗体中的 WPF 设计经验。精心设计TableLayoutPanel的控件会尽最大努力调整控件的大小,以使它们适合表单。结合AutoSize控件、停靠和 Soeren Kuklau 提到的AutoScaleMode,您应该能够制作出可以很好缩放的东西。如果没有,您的表单上可能有太多控件;考虑将其拆分为标签页、浮动工具箱或其他一些空间。

在 WPF 中这要容易得多,因为自动调整大小控件的概念是内置的;在大多数情况下,如果您使用坐标对放置 WPF 元素,那么您做错了。尽管如此,您仍然无法改变这样一个事实,即在较低分辨率下,填充屏幕不需要太多 120 dpi 文本。有时问题不是你的布局,而是试图在一个小空间里放太多东西。

于 2008-09-08T21:25:57.610 回答
4

如果我要坚持使用 Windows 窗体,那么实现与字体大小无关的布局的所有技巧是什么,这种布局可以在用户设置大字体或将显示设置为 120 DPI 时存活下来?

一方面,AutoScaleMode可能是您的朋友。

于 2008-09-08T20:00:53.743 回答
4

通常,问题在于使用两个不同的“常量”进行表单布局,然后更改其中一个常量而不更改另一个常量。

您正在为表单实体使用像素,并使用点(基本上是英寸)来指定字体大小。像素和点由 DPI 关联,因此您更改了 DPI,突然您的像素固定值与您的点固定值不一致。

对此有一些包和类,但最终您必须选择一个单位或另一个单位,或者根据不断变化的常数缩放其中一个单位。

就个人而言,我会将表单上的实体更改为英寸。我不是 C# 人,所以我不知道这是否受本机支持,或者您是否必须在应用程序启动时执行一些动态表单大小调整。

如果您必须在您的软件中执行此操作,请继续正常调整所有内容(例如,调整为您通常的 96 DPI)。

当您的应用程序启动时,请在显示您的表单之前验证系统的 DPI 为 96。如果是,那就太好了。如果不是,则使用校正因子设置一个变量,并在显示表单之前对每个实体进行缩放和平移(修改位置和大小)。

但是,最终的方法是以英寸或磅为单位指定所有内容(一个点是 1/72 英寸)并让操作系统处理它。您可能必须处理极端情况(具有正确设置 DPI 的户外屏幕会以几个像素显示您的应用程序......)

于 2008-09-08T20:34:36.003 回答