Как смоделировать выпадающее окно в WinForms? - PullRequest
5 голосов
/ 29 декабря 2011

Я знаю, что элемент управления Windows Combobox - это не что иное, как a Textbox и ListBox, склеенные вместе .

Мне нужно смоделировать то же самое в WinForms.я пытаюсь выяснить параметры окна Windows, которые должны быть установлены для достижения надлежащего эффекта.

  • раскрывающийся список не может быть дочерним окном -в противном случае оно обрезается до родительской области
  • , концептуально это должно быть всплывающее окно - перекрывающееся окно
  • это может быть собственное окно - собственное окно всегда находится над своим владельцем в z-порядке.Система автоматически уничтожает собственное окно, когда его владелец уничтожается.Окно, находящееся в собственности, скрыто, когда его владелец свернут.

Лучшее, что мне удалось до сих пор, - это создать

  • без полей (this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None)
  • topmost (this.TopMost = true)
  • форма, которая не отображается на панели задач (this.ShowInTaskbar = false)

эта верхняя форма без полей содержит мой элемент управления "раскрывающийся список",я «скрываю» свое раскрывающееся меню, когда раскрывающаяся форма теряет фокус:

this.Deactivate += new EventHandler(TheDropDownForm_Deactivate);

void TheDropDownForm_Deactivate(object sender, EventArgs e)
{
   ...

   this.Close();
}

Этот конгломерат беспорядка работает достаточно хорошо ...

enter image description here

...кроме того, что «выпадающий» отвлекает внимание от формы владельца.

И это мой вопрос, какими свойствами должно обладать мое всплывающее окно?

Но тогда как мне скрыть мою выпадающую форму, когда она теряет фокус - , когда она не может потерять фокус ?


Как сделатья имитирую выпадающий список в .NET?


Примечание: Не путайте то, что вы видите на скриншоте примера с чем-то другим.я спрашиваю, как создать «выпадающую» форму в Winforms - содержимое может отличаться от скриншота выше:

enter image description here

1 Ответ

4 голосов
/ 29 декабря 2011

С помощью ToolStripControlHost и 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...