字体相关的控件定位
我想在Vista上使用Segoe UI 9 pt,在Windows XP / etc上使用Tahoma 8 pt。 (实际上,我两个都愿意使用Segoe UI,但是我的用户可能没有安装它。)但是,由于它们截然不同,它们确实使我的表单布局更加混乱。那么...有什么好办法解决这个问题吗?
一个例子:我有一个"标签",中间有一些空白,在其中放置了" NumericUpDown"控件。如果我使用Segoe UI,则与使用Tahoma时相比," NumericUpDown"在空白区域的左侧大约5个像素左右。这是痛苦的。我不确定在这里做什么。
因此,最具体地说,我的问题是:如何将控件放置在我的Label
(或者CheckBox
es等)中的空白处?最普遍的说:在Windows窗体中是否有很好的方法来处理各种字体?
编辑:我不认为人们理解这个问题。我知道如何根据OS更改字体。我只是不知道如何处理这样做所引起的布局问题。
回复ajryan,quick_dry:好的,你们明白了这个问题。我想MeasureString可能会起作用,尽管我会对进一步探索解决此问题的更好方法感兴趣。
拆分控件的问题最明显的是" CheckBox"。在那里,如果用户单击CheckBox的"后半部分"(我想这将是一个单独的" Label"控件),则CheckBox不会改变状态。
解决方案
回答
首先,可以通过系统库中的OperatingSystem.Platform属性找出要使用的Windows版本。
其次,我们可能会将字体设置放在"资源"文件中,并根据某些条件(例如,操作系统版本)确定要使用的资源文件。
不过,就我个人而言,我认为最好让用户确定他们喜欢的字体,而不是我们想要使用的字体。
最后,我们可能想看一下WPF,因为这是WPF旨在解决的问题空间之一。
回答
解决控件的位置问题吗?也就是说,我们知道字体X和Y在OS A和B上都可以工作,并为我们提供所需的布局以及在这些系统上使用的文本吗?
MeasureString方法可能会以一种不受特定字体限制的方式来设计布局。
浮点型textWidth = graphics.MeasureString(someString,someFont).Width;
(是否需要更改文本对齐方式?我也可能会误解这个问题)
回答
需要将一个控件布置在另一个控件中是很奇怪的。我们可能错误地解决了上游问题。我们是否可以将标签分成两个标签,并且上下两个标签之间可能靠Windows Forms TableLayout面板?
如果必须根据字体大小定位,则可以使用Graphics.MeasureString(" updown之前的字符串",myLabel.Font)
如果我们要查找的是字体相关的控件定位,则应该重命名该问题。
[edit]我们可以处理标签的"后半部分"的click事件,并更改该事件的复选框状态。整个事情看起来像是骇客。这种怪异的控制布局解决了什么问题?为什么在标签中间需要上下放置?
回答
我第二次将TableLayoutPanel用于单行内联控件。
我通常将每一列和第一行设置为AutoSize,并将每个子控件的Dock属性设置为Fill in设计器。这样可以使水平布局正确显示。
若要使文本在标签/文本框之间对齐,请将TextAlign属性设置为MiddleLeft。
如果文本流到下一行,则没有简单的解决方案。使用Graphics.MeasureString / TextRenderer.MeasureText和一些奇特的环绕逻辑是我们最好的选择:(