C#:DateTimePicker 在使用自定义格式的低宽度程序启动时有下拉显示错误。是什么原因造成的?

C#: DateTimePicker has dropdown display errors on program startup at low width with custom format. What is causing this?

DateTimePicker 右侧有一个日历下拉按钮。通常它会显示一个小日历图标,但如果将控件的大小调整到图标与文本重叠的程度,它会变成一个更细的箭头下拉菜单。

问题: 如果 DateTimePicker 在程序启动时低于该宽度,则下拉图标非常宽并与文本重叠。调整 window 的大小会水平修正宽度,之后它会保持修正。

我想知道:

  1. 这是什么原因造成的。
  2. 如何最好地修复它。

这是它的样子:

启动时

调整后

编辑#1:

这个显示问题似乎只在启动时发生。如果我根据用户输入添加新控件,它会正确显示:

编辑#2:

我进一步缩小了导致问题的范围。它仅在以下情况下发生(在我的电脑上,运行 Windows 8.1):

如果我将控件的自定义格式设置为 "MMMM d, yyyy",我就会遇到问题。此格式与 DateTimePicker.Format 设置为 'Long' 时完全相同,但如果没有自定义格式,控件将正确显示。

正如Hans在上面的评论中指出的那样:

It is just a plain bug, nothing you can do about it because it is baked into the OS.

这回答了问题的第一部分,意味着我们一直在努力解决它。这留下了几个选项:

  1. 使控件在启动时足够大。这要求您在布置表单时注意错误,但它很简单并且有效。
  2. 使用 Form.Load 等到表单加载后添加控件。此解决方案是一劳永逸的,但涉及修改表单对象本身,这可能不适用于所有人。

选项 2 很适合我的目的。代码看起来像这样:

public class EventForm : Form
{
    public EventForm()
    {
        this.Load += AddControls;
    }

    private void AddControls (object sender, EventArgs e)
    {
        DateTimePicker startDate = new DateTimePicker();
        startDate.Format = DateTimePickerFormat.Custom;
        startDate.CustomFormat = "MMM dd, yyyy — h:mm tt";
        startDate.Dock = DockStyle.Top;

        this.Controls.Add(startDate);
        // Add the rest of your controls here.
    }
}

我不确定这种方法是否有任何缺点,但我相信如果有的话我会很快发现的。

感谢其他答案和反馈。现在我要把这个标记为答案;希望它对以后的人有所帮助!