Padding / Size / Margin, при использовании ToolstripControlHost для всплывающего элемента управления - PullRequest
3 голосов
/ 11 ноября 2011

Я использую VB2008 Express. И я работал над «всплывающим окном», чтобы выбрать диапазон дат. DateTimePicker не идеален, потому что цель состоит в том, чтобы выбрать диапазон дат, который всегда будет одна полная неделя, с воскресенья по субботу. Управление работает просто отлично, и я очень горжусь этим. Моя проблема связана с границей, добавленной при использовании ToolstripControlHost для этого. Я включил скриншот и мой код.

enter image description here

В приведенном ниже коде предположим, что существует кнопка с именем "btnTimePeriod", под которой я хочу показать панель, содержащую несколько пользовательских элементов, и название панели - "pnlDateRangePicker".

ЭТО РАБОТАЕТ ... но выглядит не так. Сама панель имеет размер 147 x 326 пикселей, но обратите внимание на прилагаемом рисунке, что она добавляет рамку вокруг панели, которая мне не нужна. Есть граница сверху, снизу и слева ... но по какой-то причине граница справа особенно велика. Хотя мой код явно не устанавливает его, AutoSize = true, поэтому я ожидал, что он будет уменьшаться вокруг панели.

Как требуется, мой код уже устанавливает значения ShowCheckMargin и ShowImageMargin false. Я не включил код для DrawDateCalander Sub, потому что он не актуален. Я верю, что даже пустая панель даст тот же результат. Я понятия не имею, откуда эта разница. Любое руководство?

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

1 Ответ

3 голосов
/ 12 ноября 2011

Я никогда не использовал ContextMenuStrip для этого, и, возможно, в этом проблема.

Вместо этого можно попробовать ToolStripDropDown:

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
...