题
这是我之前问题的后续“依赖于字体的控制定位。“这是试图解决这个问题 真实的 这个问题背后的问题,也许与我所问的问题不同。
问题陈述示例: 我想要一个复选框,上面写着“调整价格 <X> <是> 加载后”,其中 <X> 是一个数字——可调节 NumericUpDown
- -和 <是> 是“百分比”或“美元”,选择由 ComboBox
. 。这将在一行上。
并发症: 我希望能够更改所有这些控件的字体(基本上将它们设置为 System.Drawing.Fonts.MessageBoxFont
, ,在 Windows XP/etc 上是 Tahoma 8 pt。和 Vista 上的 Segoe UI 9 pt),不会弄乱我的布局,这与我当前的 Position
-property--设置范例不起作用。
更一般地说,我希望控件以独立于字体的方式动态布局,以便 <X> NumericUpDown
紧贴“by”和“the”之间的空间 <是> ComboBox
, ,并且类似地 <X> ComboBox
适合于 <X> CheckBox
及其右侧的字符串“加载后”。
每个人似乎都会错过的部分: 这一切都嵌套在一个 CheckBox
. 。因此,理想情况下,单击“加载后”单词应检查/取消选中复选框,并在“加载后调整价格”围绕“调整价格”。所以只拍打额外的 Label
最后不起作用,因为这样它就不会切换 CheckBox
;同样,尝试通过连接这样的东西来创可贴 Label
的 Click
事件不会产生所需的突出显示矩形。
解决方案? 此时我在想:
以某种方式重新思考这个问题,也许用一个丑陋的解决方案,比如两行单独的文本:“加载后调整发现的价格”(
CheckBox
), "调整金额:" (NumericUpDown
和ComboBox
)。这真的很糟糕,因为我的选项框绝对充满了这种类型的选项(即示例中的类型),因此它的垂直尺寸至少会增加一倍。某种自定义控件?
SplittableCheckBox
?某种魔法
TableLayout
控制?(很肯定这在“每个人似乎都错过的部分”失败了。)放弃,要么回到 MS Sans Serif,要么统一使用 Tahoma,要么将 Segoe UI 与我的应用程序打包在一起,从而不尊重系统默认字体。
(新,通过编辑)切换到 WPF,如果有人能让我相信它完全支持这种情况。
解决方案
如果您有多个遵循此布局的选项,为什么不创建一个用户控件呢?用户控件将包含 CheckBox、NumericUpDown、ComboBox 和“加载后”标签。您可以重写 OnFontChanged 以根据给定字体的文本呈现来调整控件的位置。将事件处理程序添加到标签以选中/取消选中复选框。
至于让焦点矩形包围所有控件,您应该能够在单击其内部控件之一时为用户控件提供焦点。