关于.net:字体相关的控件定位

关于.net:字体相关的控件定位

Font-dependent control positioning

我想在Vista上使用Segoe UI 9 pt,在Windows XP / etc上使用Tahoma 8 pt。 (实际上,我两个都愿意使用Segoe UI,但是我的用户可能没有安装它。)但是,由于两者截然不同,它们确实使我的表单布局更加混乱。那么...有什么好办法解决这个问题吗?

例如:我有一个Label,中间有一些空格,在其中放置了NumericUpDown控件。如果我使用Segoe UI,则与使用Tahoma相比,NumericUpDown大约在空白区域的左侧约5个像素。这很痛苦;我不确定在这里做什么。

因此,最具体地说,我的问题是:如何在Label s(或CheckBox es等)中的空白中间放置控件?最普遍的说:在Windows窗体中是否有很好的方法来处理各种字体?

编辑:我不认为人们理解这个问题。我知道如何根据OS更改字体。我只是不知道该如何处理由此引起的布局问题。

回复ajryan,quick_dry:好的,你们明白了这个问题。我想MeasureString可能有用,尽管我对进一步探索解决此问题的更好方法感兴趣。

拆分控件的问题最明显,例如CheckBox。在那里,如果用户单击CheckBox的"后半部分"(我想这是一个单独的Label控件),则CheckBox不会更改状态。


我第二次将TableLayoutPanel用于单行内联控件。

我通常将每一列和第一行设置为AutoSize,并将每个子控件的Dock属性设置为Fill in设计器。这样可以使水平布局正确显示。
若要使文本在标签/文本框之间对齐,请将TextAlign属性设置为MiddleLeft。

如果您的文本流到下一行,则没有简单的解决方案。最好使用Graphics.MeasureString / TextRenderer.MeasureText和一些精美的包装逻辑:(


需要在另一个控件中布局一个控件很奇怪。您可能错误地解决了上游问题。您是否可以将标签分成两个标签,并且上下两个标签之间可能靠Windows Forms TableLayout面板?

如果必须根据字体大小定位,可以使用Graphics.MeasureString(" updown之前的字符串",myLabel.Font)

如果您要查找的是字体相关的控件定位,则可能应该重命名该问题。

[edit]您可以处理标签"后半部分"的click事件,并更改该事件的复选框状态。整个事情似乎像一个hack。这种奇怪的控件布局可以解决什么问题?为什么在标签中间需要上下放置?


解决控件的位置问题吗?也就是说,您知道字体X和Y在OS A和OS B上都可以工作,并给出所需的布局以及在这些系统上使用的文本吗?

MeasureString方法可能会帮助您以一种不受特定字体限制的方式来设计布局。

float textWidth = graphics.MeasureString(someString,someFont).Width;

(是否需要更改文本对齐方式?我也可能会误解这个问题)


首先,可以通过系统库中的OperatingSystem.Platform属性找出要使用的Windows版本。

其次,您可能会将字体设置放在"资源"文件中,并根据某些条件(例如,您的操作系统版本)确定要使用的资源文件。

不过,就我个人而言,我认为最好让您的用户确定他们喜欢的字体,而不是您想要使用的字体。

最后,您可能想看一下WPF,因为这是WPF旨在解决的问题空间之一。


推荐阅读