与字体相关的控制定位
-
09-06-2019 - |
题
我想在 Vista 上使用 Segoe UI 9 pt,在 Windows XP 等上使用 Tahoma 8 pt。(实际上,我会在两者上使用 Segoe UI,但我的用户可能没有安装它。)但是,这些完全不同,它们确实搞乱了我的表单布局。所以...有没有好的办法来处理这个问题?
一个例子:我有一个 Label
, ,中间有一些空白,我在其中放置了一个 NumericUpDown
控制。如果我使用 Segoe UI, NumericUpDown
与我使用 Tahoma 时相比,空白区域左侧大约有 5 个像素左右。这是一种痛苦;我不知道在这里做什么。
最具体地说,我的问题是:如何将控件放置在空白区域的中间 Label
s(或 CheckBox
es等)?最一般的是:有没有好的方法来处理 Windows 窗体中的不同字体?
编辑: :我认为人们没有理解这个问题。我知道怎么做 改变我的字体 基于操作系统。我只是不知道该怎么做 处理布局问题 这样做所产生的。
回复 ajryan, Quick_dry: :好吧,你们明白这个问题了。我想 MeasureString 可能会起作用,尽管我有兴趣进一步探索更好的方法来解决这个问题。
分割控制的问题最明显的是,例如, CheckBox
. 。在那里,如果用户单击复选框的“后半部分”(这将是一个单独的 Label
我猜是控制), CheckBox
不改变状态。
解决方案
需要将一个控件布局在另一个控件中,这很奇怪。您可能错误地解决了上游问题。您是否能够将标签拆分为两个标签,其间为上下,并且可能依赖于 Windows 窗体 TableLayout 面板?
如果必须尝试根据字体大小进行定位,您可以使用 图形.测量字符串(“updown 之前的字符串”,myLabel.Font)
如果您想要的是依赖于字体的控件定位,那么您可能应该重新命名问题。
[编辑] 您可以处理标签“后半部分”的单击事件并更改该事件的复选框状态。整件事看起来就像是黑客攻击。这种奇怪的控件布局要解决什么问题?为什么标签中间需要有上下关系?
其他提示
我赞同将 TableLayoutPanel 用于单行内联控件。
我通常在设计器中将每一列和第一行设置为 AutoSize,并将每个子控件的 Dock 属性设置为 Fill。这使得水平布局能够正确显示。要使文本在标签/文本框之间对齐,请将 TextAlign 属性设置为 MiddleLeft。
如果您的文本流到下一行,则没有简单的解决方案。使用 Graphics.MeasureString/TextRenderer.MeasureText 和一些奇特的包装逻辑是你最好的选择:(
问题出在控制装置的放置上吗?IE。您知道字体 X 和 Y 在操作系统 A 和 B 上工作,并为您在这些系统上使用的文本提供您想要的布局吗?
MeasureString 方法可能有助于以不受特定字体束缚的方式制定布局。
float textWidth = Graphics.MeasureString(someString, someFont).Width;
(文本对齐方式的改变会起作用吗?我也可能误解了这个问题)