将控件放置在CheckBox的中间

时间:2020-03-05 18:46:07  来源:igfitidea点击:

这是我之前的问题"字体相关的控件定位"的后续内容。这是试图解决该问题背后的实际问题的一种尝试,也许所采用的方式可能与我所问的方式不同。

问题声明的示例:我想要一个复选框,其中显示"加载后按<X> <Y>调整价格",其中<X>是一个数字-可以通过NumericUpDown进行调整-而<Y>是"百分比"或者"美元",由"组合框"选择。这将在一行上。

复杂之处:我希望能够为所有这些控件更改字体(基本上将它们设置为" System.Drawing.Fonts.MessageBoxFont",在Windows XP / etc上为Tahoma 8 pt,在Vista上为Segoe UI 9 pt) ,而不会弄乱我的布局,而这与我当前的"位置"-属性设置范式不起作用。

更一般而言,我希望控件以独立于字体的方式动态地布置,以便<X>NumericUpDown恰好适合" by"和<Y>ComboBox之间的空间,类似地<X>ComboBox相对于<X>CheckBox以及右侧的字符串" after after"适合。

每个人似乎都想念的部分:全部嵌套在CheckBox中。因此,理想情况下,单击"加载后"一词应选中/取消选中该复选框,并在"加载后调整价格"周围绘制一个小的高亮矩形。因此,只拍一个额外的Label根本不起作用,因为那样就不会切换CheckBox了。类似地,尝试通过挂接这样的LabelClick事件来创可贴不会产生所需的高亮矩形。

解决方案?在这一点上,我在想:

  • 以某种方式重新思考问题,也许使用一个丑陋的解决方案,例如两行单独的文本:"加载后调整发现的价格"(" CheckBox"),"调整金额:"(" NumericUpDown"和" ComboBox")。这真的很糟糕,因为我的选项框中绝对充满了这种类型的选项(即示例中的类型),因此它的垂直大小至少会翻倍。
  • 某种自定义控件? SplittableCheckBox
  • 带有TableLayout控件的某种魔术? (可以肯定的是,这在"每个人似乎都错过的部分上都失败了。)
  • 放弃并返回MS Sans Serif,或者统一使用Tahoma,或者将Segoe UI与我的应用程序打包在一起,从而不尊重系统默认字体。
  • (新功能,通过编辑)如果有人可以说服我它完全支持这种情况,请切换到WPF。

解决方案

回答

如果遵循此布局有多个选项,为什么不创建用户控件?用户控件将包含CheckBox,NumericUpDown,ComboBox和"加载后"标签。我们可以重写OnFontChanged,以根据具有给定字体的文本的呈现来调整控件的位置。将EventHandler添加到Label中以选中/取消选中CheckBox。

至于使焦点矩形包围所有控件,则应在单击其内部控件之一时为用户控件赋予焦点。