MenuStrip 中的 DatetimePicker 和其他控件

DatetimePicker and other Controls in MenuStrip

我知道我可以使用以下行将 DateTimePicker 添加到我的 MenuStrip

Dim dp = New ToolStripControlHost(New DateTimePicker)
MenuStrip1.Items.Add(dp)  

但我不知道如何在设计时将 DateTimePicker 添加到 MenuStrip。背后有何诀窍?我已经尝试和搜索了将近一个小时,但我即将放弃,尽管我知道一定有办法!

TL;DR
如何在设计时将 DateTimePicker 添加到我的 MenuStrip? 或者我们可以将它添加到 ToolStrip。

本来打算添加为评论,但我相信它证明了答案的合理性。

我成功的唯一方法是在设计时添加一个(到表单)并将 Visible 设置为 False 并使用菜单项设置 VisibleTrue(可能还需要设置位置and/or把它放到最前面)。

您确实需要再次手动处理 VisibleFalse 的设置。

您已接近使用 ToolStripControlHost, but you will need to derive from that class as shown in the linked-to example. The frustrating thing with that example is that it does not decorate the derived class with the System.Windows.Forms.Design.ToolStripItemDesignerAvailabilityAttribute 使其在设计图面上可用的解决方案。

以下是获得工作示例的极简实现。您可能需要覆盖自动调整大小以适合您的 needs/wants 控件。该实现覆盖 Text 属性 以防止设计者将无效文本分配给基础 DateTimerPicker 控件。

<System.Windows.Forms.Design.ToolStripItemDesignerAvailability(
    System.Windows.Forms.Design.ToolStripItemDesignerAvailability.ToolStrip _
    Or System.Windows.Forms.Design.ToolStripItemDesignerAvailability.StatusStrip _
    Or System.Windows.Forms.Design.ToolStripItemDesignerAvailability.MenuStrip)> _
Public Class TSDatePicker : Inherits ToolStripControlHost
    Public Sub New()
        MyBase.New(New System.Windows.Forms.DateTimePicker())
    End Sub

    Public ReadOnly Property ExposedControl() As DateTimePicker
        Get
            Return CType(Control, DateTimePicker)
        End Get
    End Property

    <Browsable(False), EditorBrowsable(EditorBrowsableState.Advanced), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
    Public Overrides Property Text As String
        Get
            Return ExposedControl.Text
        End Get
        Set(value As String)
            ' verify valid date
            Dim dt As DateTime
            If DateTime.TryParse(value, dt) Then
                ExposedControl.Text = value
            End If
        End Set
    End Property
End Class