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
并使用菜单项设置 Visible
到True
(可能还需要设置位置and/or把它放到最前面)。
您确实需要再次手动处理 Visible
到 False
的设置。
您已接近使用 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
我知道我可以使用以下行将 DateTimePicker 添加到我的 MenuStrip
Dim dp = New ToolStripControlHost(New DateTimePicker)
MenuStrip1.Items.Add(dp)
但我不知道如何在设计时将 DateTimePicker 添加到 MenuStrip。背后有何诀窍?我已经尝试和搜索了将近一个小时,但我即将放弃,尽管我知道一定有办法!
TL;DR
如何在设计时将 DateTimePicker 添加到我的 MenuStrip?
或者我们可以将它添加到 ToolStrip。
本来打算添加为评论,但我相信它证明了答案的合理性。
我成功的唯一方法是在设计时添加一个(到表单)并将 Visible
设置为 False
并使用菜单项设置 Visible
到True
(可能还需要设置位置and/or把它放到最前面)。
您确实需要再次手动处理 Visible
到 False
的设置。
您已接近使用 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