【问题标题】:Font-dependent control positioning字体相关的控制定位
【发布时间】:2010-09-07 10:17:48
【问题描述】:

我想在 Vista 上使用 Segoe UI 9 pt,在 Windows XP/etc 上使用 Tahoma 8 pt。 (实际上,我会满足于两者上的 Segoe UI,但我的用户可能没有安装它。)但是,它们完全不同,它们真的搞砸了我的表单布局。那么……有什么好的办法来解决这个问题吗?

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

所以最具体地说,我的问题是:如何在我的Labels(或CheckBoxes 等)的空白区域中间放置控件?最普遍的是:有没有一种处理 Windows 窗体中不同字体的好方法?

编辑:我认为人们不理解这个问题。我知道如何根据操作系统改变我的字体。我只是不知道如何处理由此产生的布局问题

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

拆分控件的问题在CheckBox 中最为明显。在那里,如果用户单击 CheckBox 的“后半部分”(我猜这将是一个单独的 Label 控件),CheckBox 不会改变状态。

【问题讨论】:

    标签: .net winforms user-interface layout fonts


    【解决方案1】:

    我赞成将 TableLayoutPanel 用于单行内联控件。

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

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

    【讨论】:

      【解决方案2】:

      需要在另一个控件中布局一个控件很奇怪。您可能错误地解决了上游问题。您是否能够将标签分成两个标签,上下颠倒,并且可能依赖于 Windows 窗体 TableLayout 面板?

      如果必须尝试根据字体大小进行定位,您可以使用Graphics.MeasureString("String before updown", myLabel.Font)

      如果您追求的是依赖于字体的控件定位,您可能应该重新命名问题。


      [编辑] 您可以处理标签“后半部分”的点击事件并更改该事件的复选框状态。整个事情看起来像一个黑客。这个奇怪的控件布局解决了什么问题?为什么你需要在标签中间有一个上下?

      【讨论】:

        【解决方案3】:

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

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

        但就个人而言,我认为让您的用户确定他们更喜欢的字体而不是您希望他们使用的字体会很好。

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

        【讨论】:

          【解决方案4】:

          问题是解决控件的位置问题吗?也就是说,您知道字体 X 和 Y 在 OS A 和 B 上工作,并使用您在这些系统上使用的文本提供您想要的布局?

          MeasureString 方法可能有助于以一种不受特定字体约束的方式来制定布局。

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

          (文本对齐方式的改变会起作用吗?我也可能误解了这个问题)

          【讨论】:

            猜你喜欢
            • 2016-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多