Как мне установить значение ScrollBar, когда оно растет динамически? - PullRequest
1 голос
/ 06 апреля 2009

Я начну с того, что пытаюсь добиться:

У меня есть данные, загруженные в диапазоне, где, скажем, прокрутка полностью влево ставит меня 1 апреля, а прокрутка вправо - 1 июня.

Пользователь помещает полосу прокрутки 1 апреля и нажимает стрелку влево на полосе прокрутки. Теперь полоса прокрутки расположена на 31 марта, и диапазон данных теперь охватывает период с 1 марта по 1 июня.

Вот моя проблема:

Я обработал нажатие левой стрелки в обработчике события Scroll (примерно следующим образом):

private void horizontalScroll_Scroll(object sender, ScrollEventArgs e)
{
    if (LeftArrowClicked())
    {
        horizontalScroll.Maximum = calculateNewMaximum(earliestDate, latestDate);
        horizontalScroll.Value = calculateNewPosition(currentDate.AddDays(-1), earliestDate);
    }
}

По завершении работы с отладчиком, в момент, когда он покидает этот обработчик события, horizontalScroll.Value падает до 0, а горизонтальный_скролл.Максимум остается на правильном значении.

Я опубликую позже с любыми разъяснениями и ответами на вопросы.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2009

Попробуйте установить e.NewValue вместо horizontalScroll.Value. Затем элемент управления будет учитывать это значение при выполнении своей собственной логики.

1 голос
/ 06 апреля 2009

Это явно вызвано установкой значения ScrollableControl после срабатывания события Scroll. Вы можете попробовать расширить используемый элемент управления и переопределить виртуальный метод OnScroll.

protected override void OnScroll(ScrollEventArgs se)
{
  base.OnScroll(se);

  // Do stuff now
}

<час />

Редактировать

Вероятно, вы должны знать, что нажатие кнопок полосы прокрутки не вызывает событие Scroll, а только событие ValueChanged. (Использование мыши генерирует и то и другое.)

<час />

Редактировать снова

Ах, ха! Я знал, что есть способ сделать это. Что вы хотите сделать вместо изменения horizontalScroll.Value, вы хотите установить NewValue для параметра ScrollEventArgs. Это должно работать:

private void horizontalScroll_Scroll(object sender, ScrollEventArgs e)
{
    if (LeftArrowClicked())
    {
        horizontalScroll.Maximum = calculateNewMaximum(earliestDate, latestDate);
        e.NewValue = calculateNewPosition(currentDate.AddDays(-1), earliestDate);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...