Vb.net 使用ToolstripControlHost作为弹出控件时的填充/大小/边距
我正在使用VB2008 Express。我一直在做一个“弹出窗口”来选择一个日期范围。DateTimePicker并不理想,因为它的目的是选择一个日期范围,从周日到周六,该范围始终为一整周。控制工作得很好,我很自豪。我的问题与使用ToolstripControlHost时添加的边框有关。我已经包括了一个截图和我的代码 在下面的代码中,假设存在一个名为“btnTimePeriod”的按钮,我希望在该按钮下方显示一个包含一些自定义项的面板,该面板的名称为“pnlDateRangePicker” 它是有效的。。。但它看起来不对劲。面板本身是147 x 326像素,但请注意,在所附的图形中,它在面板周围添加了一个边框,这是我不想要的。顶部、底部和左侧都有边框。。。但由于某些原因,右边的边界特别大。虽然我的代码没有明确设置它,但AutoSize=true,因此我希望它在面板周围收缩 根据需要,我的代码已将ShowCheckMargin和ShowImageMargin设置为false。我没有包括DrawDateCalander子项的代码,因为它不相关。我相信即使是一个空白小组也会产生同样的结果。我不知道利润是从哪里来的。有什么指导吗Vb.net 使用ToolstripControlHost作为弹出控件时的填充/大小/边距,vb.net,popup,toolstripcontrolhost,Vb.net,Popup,Toolstripcontrolhost,我正在使用VB2008 Express。我一直在做一个“弹出窗口”来选择一个日期范围。DateTimePicker并不理想,因为它的目的是选择一个日期范围,从周日到周六,该范围始终为一整周。控制工作得很好,我很自豪。我的问题与使用ToolstripControlHost时添加的边框有关。我已经包括了一个截图和我的代码 在下面的代码中,假设存在一个名为“btnTimePeriod”的按钮,我希望在该按钮下方显示一个包含一些自定义项的面板,该面板的名称为“pnlDateRangePicker” 它
Private Sub btnTimePeriod_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTimePeriod.Click
Call DrawDateCalendar(DatePart(DateInterval.Month, FirstDisplayedSunday), DatePart(DateInterval.Year, FirstDisplayedSunday))
Call ShowControlBelow(btnTimePeriod, pnlDateRangePicker)
End Sub
Sub ShowControlBelow(ByVal Showbutton As Control, ByVal ShownControl As Control)
Dim PopupContainer As New ToolStripControlHost(ShownControl)
PopupContainer.Margin = New Padding(0)
Dim mnuDropDown As New ContextMenuStrip
mnuDropDown.Padding = New Padding(0)
mnuDropDown.ShowCheckMargin = False
mnuDropDown.ShowImageMargin = False
mnuDropDown.Items.Add(PopupContainer)
ShowMenuBelow(Showbutton, mnuDropDown)
End Sub
Sub ShowMenuBelow(ByVal Showbutton As Control, ByVal WhichMenu As ContextMenuStrip, Optional ByVal AlignRight As Boolean = False)
Dim x As Integer = 0
Dim y As Integer = 0
Dim itscontainer As Control = Showbutton.Parent
x = Showbutton.Location.X
y = Showbutton.Location.Y
If Not itscontainer Is Nothing Then
Do Until TypeOf itscontainer Is Form
x = x + itscontainer.Location.X
y = y + itscontainer.Location.Y
itscontainer = itscontainer.Parent
If itscontainer Is Nothing Then Exit Do
Loop
End If
y = y + Showbutton.Height
If AlignRight = True Then
x = x - WhichMenu.Width + Showbutton.Width
End If
Dim xy As New Point(x, y)
WhichMenu.Show(Showbutton.FindForm, xy)
End Sub
我从来没有使用过
ContextMenuStrip
,也许这就是问题所在
您可以尝试改用工具条下拉列表
:
Private Sub ShowControl(ByVal fromControl As Control, ByVal whichControl As Control)
'\\ whichControl needs MinimumSize set:
whichControl.MinimumSize = whichControl.Size
Dim toolDrop As New ToolStripDropDown()
Dim toolHost As New ToolStripControlHost(whichControl)
toolHost.Margin = New Padding(0)
toolDrop.Padding = New Padding(0)
toolDrop.Items.Add(toolHost)
toolDrop.Show(Me, New Point(fromControl.Left, fromControl.Bottom))
End Sub
Private Sub btnTimePeriod_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnTimePeriod.Click
Call DrawDateCalendar(DatePart(DateInterval.Month, FirstDisplayedSunday), DatePart(DateInterval.Year, FirstDisplayedSunday))
'\\Call ShowControlBelow(btnTimePeriod, pnlDateRangePicker)
Call ShowControl(btnTimePeriod, pnlDateRangePicker)
End Sub
非常感谢。拉尔斯泰克的回答是正确的。但是有两个警告:1)我必须mnuDropDown.Maximumsize来明确指定mnuDropDown的大小。结果表明,与ShownControl相比,宽度和高度减少了3个像素。我假设它是填充或边距设置,但当为涉及的任何控件设置属性时,这两个属性都没有任何效果。2) 下面的ShowMenuBlow过程的目的是,当按钮可能位于嵌套容器的几层内时,查找相对于窗体的适当X/Y位置。