Могу ли я получать события непосредственно из HScrollBar в .net?

#.net #scrollbar

#.net #полоса прокрутки

Вопрос:

У меня есть странное требование. В наших данных есть тики, которые связаны со временем. Каждый тик может содержать от 0 до 50 точек данных. Я хочу, чтобы галочки располагались на полосе прокрутки, поэтому, если вы перетаскиваете маркер, вы прокручиваете галочки. Но я хочу, чтобы стрелки менялись между точками данных, так что, если вы используете одну из стрелок для пошагового просмотра, вы увидите каждую точку данных.

Возможно ли для меня получать события непосредственно из HScrollBar, чтобы я знал, нажал ли пользователь стрелку или перетащил дескриптор?

Комментарии:

1. Я думаю, что панель отслеживания предназначалась для этого.

2. Хм… На панели треков есть только ползунок. Мне нужны и ползунок, и стрелки. Если только я чего-то здесь не упускаю.

Ответ №1:

Вы действительно можете использовать HScrollBar и VScrollBar напрямую, хотя это не дает вам позиции так, как вы говорите, вы хотите. Вы можете установить объем пространства, на которое она перемещается, когда пользователь щелкает стрелку (это должно быть SmallIncrement и SmallDecrement ) и когда пользователь щелкает в области прокрутки ( LargeIncrement и LargeDecrement ). Но вы не можете установить объем пространства, на которое она перемещается, когда пользователь перетаскивает большой палец.

Потенциально вы могли бы переместить положение прокрутки, когда пользователь прекратит перетаскивание (округляя результирующую позицию), но это может сбить пользователя с толку. Посмотрите на HScrollBar.Scroll событие и ScrollEventArgs.Type свойство.

Вероятно, лучше использовать TrackBar и добавить кнопки со стрелками влево и вправо в свой пользовательский интерфейс. Заставить HScrollBar работать так, как вы хотите, будет сложно, и, вероятно, это будет выглядеть не так красиво, как TrackBar .

Ответ №2:

Полоса прокрутки не предназначена для этого. Во-первых, диапазон основан на значении от минимального до максимального, а затем смещен на значение LargeChange. Другими словами, полоса прокрутки не прокручивается от минимума к максимуму (как это обычно делается в VB6).

Попробуйте вместо этого использовать элемент управления TrackBar. Вы не получаете стрелок, только дескриптор, но это дает вам почти все, что вы ищете.

Комментарии:

1. С помощью TrackBar как мне отличить переход от отметки к отметке и переход от точки данных к точке данных? Я не говорю, что вы неправы, я просто не совсем понимаю, как заставить его вести себя этими двумя способами.

2. @Almo Не уверен, что понимаю ваши ссылки на описание точек данных. Это может быть ясно на картинке. Похоже, вы хотите рассматривать стрелки и дескриптор как отдельные вещи, почти полностью не связанные.

3. У нас разные объемы данных для каждого временного интервала. Например, мы могли бы получить 1 точку данных в первую секунду, 20 во вторую секунду и 2 в третью секунду. Я хочу, чтобы у полосы прокрутки было 3 местоположения для дескриптора: 1-я, 2-я и 3-я секунды. Но если я помещу ее на 2-ю, я хочу, чтобы мне пришлось 20 раз щелкнуть стрелку вправо, чтобы просмотреть 20 точек данных, прежде чем дескриптор переместится на 3-ю секунду.

4. @Almo звучит как UserControl с кнопками по концам и панелью отслеживания, заполняющей середину. То, что вы описываете, не произойдет с полосой прокрутки, потому что стрелки и дескриптор сообщают «значение» элемента управления — вы не можете разделить это.

5. Спасибо за вашу помощь. Я хотел бы принять несколько ответов, но я могу, по крайней мере, поддержать оба.