Реализация AutoSize в пользовательском UserControl - PullRequest
1 голос
/ 28 февраля 2012

У меня есть собственный UserControl, который рисует текст и графику, используя GDI +.Обычно я подключаю его с помощью DockStyle.Bottom в другом элементе управления.

Размер этого элемента управления определяется пользовательским макетом с использованием Graphics.MeasureString ().Поэтому он должен пересчитывать высоту каждый раз, когда изменяется ширина, которая изменяется при изменении родительской ширины.

В настоящее время я устанавливаю высоту этого элемента управления в его событии OnSizeChanged.Однако я заметил некоторые ошибки с этим.Иногда, когда я изменяю размер родительского элемента, элемент управления не касается нижней части родительского элемента, даже если для него установлено значение DockStyle.Bottom.Я использовал Spy ++ для анализа границ элемента управления, и между элементом управления и краем родительского элемента есть примерно какое-то пустое пространство примерно на 20 пикселей.

Я хочу реализовать правильный AutoSize в этом пользовательском элементе управления с допуском сверху или снизуDockStyle.

1 Ответ

1 голос
/ 28 февраля 2012

Механизм DefaultLayout для WindowsForms содержит довольно немного логики для размещения закрепленных элементов управления. Я бы порекомендовал декомпилятор (dotPeek, Reflector и т. Д.) И декомпилировал класс DefaultLayout.

Существует много взаимодействий между самим элементом управления, его дочерними элементами, переопределяет ли он GetPreferredSize и т. Д. И т. Д.

Возможно, когда вы поймете контекст, в котором вызывается ваш GetPreferredSize, вы получите лучшее представление о том, как его реализовать.

С точки зрения примеров реализации, опять же, что может быть лучше, чем сами элементы управления Windows? Декомпилируй несколько. Вот пример из ToolStripItem

 public virtual Size GetPreferredSize(Size constrainingSize)
    {
      constrainingSize = LayoutUtils.ConvertZeroToUnbounded(constrainingSize);
      return this.InternalLayout.GetPreferredSize(constrainingSize - this.Padding.Size) + this.Padding.Size;
    }

Удачи!

...