Как связать положение полосы прокрутки набора элементов управления? - PullRequest
0 голосов
/ 28 декабря 2011

Я пишу класс Scope, наследующий UserControl.Я использую Scope для рисования фигур с одинаковой отметкой времени.Поэтому я хочу прокрутить всю область действия, когда прокручиваю одну из них.Я думаю, я просто делаю метод OnScroll статическим, но он не работает.

Что мне делать?

Любой совет приветствуется.

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

У меня будет класс CompositeScroll с методом AddScrollbar. Этот класс относится к прокрутке каждой добавляемой полосы прокрутки и заставляет остальных менять свою позицию там. Примерно так:

public class CompositeScroll
{
    private List<Scrollbar> scrollbars = new List<Scrollbars>();

    public void AddScrollbar(Scrollbar scrollbar)
    {
        scrollbars.Add(scrollbar);
        scrollbar.OnScroll += OnScroll;
    }

    private void OnScroll(object sender, EventArgs e)
    {
        var current = (Scrollbar)sender;
        var scrollbarsToMove = scrollbars.Where(x => x != current);

        foreach(var scrollbar in scrollbarsToMove)
            scrollbar.Position = current.Position;
    }
}

public class MyForm : Form
{
    private CompositeScroll compositeScroll = new CompositeScroll();        

    public MyForm()
    {
        InitializeComponents();
        compositeScroll.AddScrollbar(scrollbar1);
        compositeScroll.AddScrollbar(scrollbar2);
        compositeScroll.AddScrollbar(scrollbar3);
        compositeScroll.AddScrollbar(scrollbar4);
    }
}

Это идея, вы можете изменить тип полосы прокрутки, используя тот, который вы используете, который содержит полосы прокрутки (возможно, простой старый UserControl).

Надеюсь, это поможет.

0 голосов
/ 28 декабря 2011

Я сделал быстрый тест с двумя вертикальными полосами прокрутки, установленными рядом. Я прикрепил обработчик следующей формы к событию Scroll каждой полосы прокрутки, чтобы каждая из них следовала за другой:

private void vScrollBar_Scroll(object sender, ScrollEventArgs e)
{
  var otherScrollBar = sender == vScrollBar1 ? vScrollBar2 : vScrollBar1;
  otherScrollBar.Value = e.NewValue;
}

В вашем случае (пользовательские элементы управления) я бы:

  1. В вашем Scope элементе управления: выставьте событие Scroll и свойство ScrollPosition. Событие перенаправляет события внутренней полосы прокрутки области в форму.
  2. В форме, подпишитесь на событие каждого элемента управления Scope (Один общий обработчик для всех Scope событий, как показано выше)
  3. В обработчике установите ScrollPosition для каждого Scope!=sender в соответствии с аргументами события прокрутки

Примечания:

  1. Установка значения полосы прокрутки программно не вызывает событие Scroll на этой полосе прокрутки. Следовательно, этот код не входит в бесконечный цикл.
  2. Конечно, если Scope имеет полосы прокрутки по горизонтали и вертикали, вам понадобится 2 события (или аргументы события, которые обозначают горизонт или верт) и 2 свойства: HorizScrollPosition и VertScrollPosition.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...