Значение ScrollBar установлено неправильно - PullRequest
3 голосов
/ 20 декабря 2010

Я пытаюсь реализовать что-то похожее на «бесконечную» прокручиваемость Excel; тем, что пользователь может прокрутить до «низа» документа; но затем продолжайте прокрутку (используя колесо прокрутки или стрелку вниз на полосе прокрутки), и для них будут сгенерированы пустые строки. У меня это в основном работает (при использовании колеса прокрутки мыши работает отлично); но у меня проблемы с функционалом SmallIncrement - то есть; когда пользователь нажимает стрелку вниз на полосе прокрутки, она должна опускаться вниз по полосе прокрутки. SmallChange, несмотря на то, что находится в нижней части диапазона прокрутки полосы прокрутки.

Вот мой код (в обработчике scrollBar_Scroll):

int difference = e.NewValue - e.OldValue;
if (e.Type == ScrollEventType.SmallIncrement)
{
    if (difference != scrollBar.SmallChange)
    {
        int increase = (scrollBar.SmallChange - difference);
        scrollBar.Maximum += increase;
        scrollBar.Value += increase;
    }
}

Глядя на это в отладчике, он устанавливает значения именно так, как я и ожидал. Однако что-то (не знаю, что) происходит после завершения функции, в результате чего scrollBar.Value возвращается к своему первоначальному значению плюс один. Если я удерживаю стрелку вниз, это работает в основном правильно. Он все еще немного подпрыгивает, когда кнопка отпущена.

Есть идеи, что может быть причиной, и как это исправить?

Ура!

Редактировать: Вот мой код колеса прокрутки. Это так похоже, что сбивает с толку, почему это не работает. Это в обработчике событий MouseWheel на панели.

int desiredValue = scrollBar.Value - e.Delta;
scrollBar.MaximumValue = (Math.Max(normalBottom, desiredValue + scrollBar.LargeChange));
scrollBar.Value = Math.Max(0, desiredValue);

normalBottom - это переменная, запоминающая «конечное» окончание полосы прокрутки - в Excel это будут либо самые низкие введенные пользователем данные, либо высота экрана; поэтому он обычно прокручивается выше этого значения (без отрицательного значения).

1 Ответ

5 голосов
/ 06 января 2011

То, что происходит с вашей полосой прокрутки, выглядит следующим образом: когда пользователь взаимодействует с полосой прокрутки, вызывая событие, и ваш обработчик события называется, значение свойства еще не было обновлено, после того как ваш обработчик события возвращает свойство, внутренне установленноеполоса прокрутки перезаписывает установленное вами значение и вызывает эффект «возврата назад», который вы упомянули.Как он запоминает, какое значение он должен установить?Легко: это в e.NewValue.И это именно ваше решение, чтобы иметь возможность правильно изменить окончательное значение этого свойства во время события прокрутки, просто напишите в e.NewValue следующим образом:

int difference = e.NewValue - e.OldValue;
        if (e.Type == ScrollEventType.SmallIncrement)
        {
            if (difference != scrollBar.SmallChange)
            {
                int increase = (scrollBar.SmallChange - difference);
                scrollBar.Maximum += increase;
                e.NewValue = scrollBar.Value + increase;
            }
        }

Я хочу связать эти страницы, которые могутиметь отношение к вам: http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.maximum.aspx

Примечание в примечаниях (поэтому даже при перемещении Maximun вы все равно получаете его только на 1 вперед):

Максимальное значение может быть достигнуто толькопрограммно.Значение полосы прокрутки не может достичь своего максимального значения в результате взаимодействия с пользователем во время выполнения.Максимальное значение, которое может быть достигнуто через взаимодействие с пользователем, равно 1 плюс значение свойства Maximum минус значение свойства LargeChange.При необходимости вы можете установить для свойства Maximum размер объекта -1, чтобы учесть срок 1.

http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.scroll.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.scrolleventargs.newvalue.aspx (Получить или установитьНовое значение полосы прокрутки. [Акцент в наборах])

...