字体大小独立UI:当我切换到120 DPI时,一切都破了?

时间:2008-09-08 19:58:23

标签: .net wpf winforms user-interface fonts

所以我正在阅读有人在另一个问题中链接的Windows Vista UI指南,并且他们提到您应该能够在切换到120 DPI后继续存在。好吧,我安装了我的应用程序,启动了我方便的虚拟机,我们得到了什么... AAAAGH !!! MASSIVE UI FAIL!

一切都是混乱的:一些容器对于他们的文本来说不够大;一些“彼此相邻”的控件现在都被挤压在一起/分开;有些按钮不够高;我的ListView列不够宽...... eeek。

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

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

基本问题似乎归结为以下几点:

  • 如果我坚持使用Windows窗体,那么实现独立于字体大小的布局有哪些技巧可以在用户设置大字体或将显示设置为120 DPI后继续存在?
  • WPF在这方面是否具有显着的优势,如果是这样,你能否说服我说它值得转换?
  • 对于与字体大小无关的布局,是否在.NET堆栈或一般情况下是否存在任何通用的“最佳实践”?

3 个答案:

答案 0 :(得分:11)

了解 Anchor Dock 属性如何在您的控件上运行,留下任何 AutoSize 本身的内容,并使用{{1你何时可以。

如果你做这三件事,你将在Windows Forms中获得很多WPF设计经验。精心设计的TableLayoutPanel将尽力调整控件的大小,使其适合表单。结合Soeren Kuklau提到的 AutoSize 控件,对接和 AutoScaleMode ,您应该能够制作出可以很好地扩展的东西。如果没有,您的表单可能只有太多的控件;考虑将其拆分为标签页,浮动工具箱或其他空间。

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

答案 1 :(得分:4)

  

如果我坚持使用Windows窗体,那么实现独立于字体大小的布局有哪些技巧可以在用户将字体设置得大,或将显示设置为120 DPI后继续存在?

首先,AutoScaleMode可能是你的朋友。

答案 2 :(得分:4)

一般来说,问题在于使用两个不同的“常量”进行表单布局,然后在不改变另一个常量的情况下更改其中一个常量。

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

有这样的包和类,但在一天结束时,您必须选择一个单位或另一个单位,或根据变化的常数缩放其中一个单位。

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

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

当您的应用程序启动时,请在显示表单之前验证系统是否为96 DPI。如果是的话,很棒。如果没有,则在显示表格之前设置一个带有修正系数的变量,并缩放和平移(修改每个实体的位置和大小)。

但最终的目的是以英寸或点(一点是1/72英寸)指定所有内容并让操作系统处理它。您可能需要处理角落情况(具有正确设置的DPI的室外屏幕会以几个像素显示您的应用程序......)