首页 文章

DateTimePicker日历按钮宽度

提问于
浏览
1

即时尝试创建一个可以为空的DateTimePicker,当控件被标记为具有空日期时,可以选择显示一些提示文本 . 为了实现这一点,我从DateTimePicker继承并添加了一个带有提示文本的Label控件,该控件覆盖了控件的文本部分被标记为具有空日期..问题是如果将DateTimePicker设置为显示通常的日历图标,则此按钮的宽度为VARIABLE ..

下面的图像显示了具有不同大小的相同DateTimePicker控件..一旦日历图标按钮开始与文本重叠,它就会变为更小,简单的下拉图标按钮 .

enter image description here

enter image description here

enter image description here

enter image description here

我可以尝试使用反射来读/写私有字段,但我不知道要读什么 .

我的问题..如何正确找出DateTimePicker控件中显示的日历图标的宽度..

2 回答

  • 1

    我自己找到了一种方式.. =)..当控件宽于显示的文本时, DateTimePicker 显示日历图标按钮 . 当按钮开始剪切文本时,控件自动回退到显示较小的下拉按钮(在原始问题的图像的第二行中可见)..所以我们找出文本的宽度,日历图标按钮,下拉按钮和控件本身..下面的数学很简单..

    const int C_BUTTONICON_WIDTH = 34;
    const int C_BUTTONARROW_WIDTH = 17;
    
    protected int GetLabelWidth()
    {
        int iControlW = this.Width;
        int iTextW = TextRenderer.MeasureString(this.Text, this.Font).Width;
    
        int iLabelW = 0;
        if (iTextW <= iControlW - C_BUTTONICON_WIDTH)
        {
            iLabelW = iControlW - C_BUTTONICON_WIDTH;
        }
        else
        {
            iLabelW = iControlW - C_BUTTONARROW_WIDTH;
        }
        return iLabelW;
    }
    

    您可能需要调整几个像素,具体取决于 Label 本身的位置.. =)..服务于我的目的.. =)

  • 0

    无需重新发明轮子 . 看一下这个:

    Nullable DateTimePicker on CodeProject

    还有这个:

    Yet another nullable DateTimePicker control

    enter image description here

相关问题