Вычислите точные размеры панели (включая внутренние) для использования в Custom ScrollBar
Подскажите пожалуйста, как узнать внутренние размеры панели, которые скрыты от глаз пользователя, если элементов много, и свойство AutoScroll = false.
На скрине указана цифра - она получена "случайно", в проекте все подписано.
При получении координат последнего внутреннего элемента, полученное значение в разы меньше того значения, которое используется, чтобы добраться до этого элемента.
public Form_Main() {
InitializeComponent();
flp_Elements.MouseWheel += Flp_Els_MouseWheel;
}
// Scrolling the panel (Flp_Els) with the mouse wheel
private void Flp_Els_MouseWheel(object sender, MouseEventArgs e) {
int step = customScrollBar1.Value -= e.Delta > 0 ? customScrollBar1.SmallStep : -customScrollBar1.SmallStep;
customScrollBar1.Value = Math.Max(customScrollBar1.Minimum, Math.Min(step, customScrollBar1.Maximum));
ScrollValue = (int)customScrollBar1.Value;
}
// Scroll the panel (Flp_Els) with the slider on the ScrollBar
private void customScrollBar1_ValueChanged(object sender, EventArgs e) {
ScrollValue = customScrollBar1.Value;
}
// Метод переопределения максимального значения, при добавлении элементов на панель
private void flp_Elements_ControlAdded(object sender, ControlEventArgs e) {
// Получилось прокрутить дальше (3820) max - дальше не двигается,
// но число максимума больше указанного выше
// ! КАК ПОЛУЧИТЬ РАЗМЕРЫ ПАНЕЛИ, КОГДА ОНА НАПОЛНЯЕТСЯ ЭЛЕМЕНТАМИ И СКРЫВАЕТ ИХ
customScrollBar1.Maximum = flp_Elements.VerticalScroll.Maximum + flp_Elements.VerticalScroll.LargeChange * 8;
flp_Elements.VerticalScroll.Maximum = customScrollBar1.Maximum;
}
// БЕЗ ЭТОГО СОДЕРЖИМОЕ ПАНЕЛИ НЕ ДВИГАЛОСЬ
// Установка пределов для панели
public int scrollValue = 0;
public int ScrollValue {
get { return scrollValue; }
set {
scrollValue = value;
// Minimum = 0 - все в пиклелях
if (scrollValue < 0) scrollValue = 0;
// Maximum - все в пиклелях
if (scrollValue > flp_Elements.VerticalScroll.Maximum)
scrollValue = flp_Elements.VerticalScroll.Maximum;
flp_Elements.VerticalScroll.Value = scrollValue;
}
}
}
На данный момент: панель прокручивается с помощью ScrollBar, но чтобы все работало правильно нужно это самое число. Пробовал разные варианты, но они не работают, как нужно:
Ответы (1 шт):
Автор решения: Ilya
→ Ссылка
private void flp_Container_ControlAdded(object sender, ControlEventArgs e) {
flp_Container.VerticalScroll.Maximum = flp_Container.GetPreferredSize(flp_Container.Size).Height - flp_Container.Size.Height;
VScrolBar1.Maximum = flp_Container.VerticalScroll.Maximum;
}

