Vb.net 使用ToolstripControlHost作为弹出控件时的填充/大小/边距

Vb.net 使用ToolstripControlHost作为弹出控件时的填充/大小/边距,vb.net,popup,toolstripcontrolhost,Vb.net,Popup,Toolstripcontrolhost,我正在使用VB2008 Express。我一直在做一个“弹出窗口”来选择一个日期范围。DateTimePicker并不理想,因为它的目的是选择一个日期范围,从周日到周六,该范围始终为一整周。控制工作得很好,我很自豪。我的问题与使用ToolstripControlHost时添加的边框有关。我已经包括了一个截图和我的代码 在下面的代码中,假设存在一个名为“btnTimePeriod”的按钮,我希望在该按钮下方显示一个包含一些自定义项的面板,该面板的名称为“pnlDateRangePicker” 它

我正在使用VB2008 Express。我一直在做一个“弹出窗口”来选择一个日期范围。DateTimePicker并不理想,因为它的目的是选择一个日期范围,从周日到周六,该范围始终为一整周。控制工作得很好,我很自豪。我的问题与使用ToolstripControlHost时添加的边框有关。我已经包括了一个截图和我的代码

在下面的代码中,假设存在一个名为“btnTimePeriod”的按钮,我希望在该按钮下方显示一个包含一些自定义项的面板,该面板的名称为“pnlDateRangePicker”

它是有效的。。。但它看起来不对劲。面板本身是147 x 326像素,但请注意,在所附的图形中,它在面板周围添加了一个边框,这是我不想要的。顶部、底部和左侧都有边框。。。但由于某些原因,右边的边界特别大。虽然我的代码没有明确设置它,但AutoSize=true,因此我希望它在面板周围收缩

根据需要,我的代码已将ShowCheckMargin和ShowImageMargin设置为false。我没有包括DrawDateCalander子项的代码,因为它不相关。我相信即使是一个空白小组也会产生同样的结果。我不知道利润是从哪里来的。有什么指导吗

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位置。