Прокрутите 2 панели одновременно - PullRequest
4 голосов
/ 20 мая 2009

У меня есть элемент управления Windows Forms (.NET 2.0), который содержит Splicontainer внутри. Сплитконтейнер, как обычно, содержит 2 панели (стандартная вещь). Автопрокрутка установлена ​​на true.

Я довольно долго пытался добиться чего-то вроде синхронизации этих двух панелей, поэтому прокрутка одной из них прокручивает и вторую. Я добился этого - используя событие прокрутки (не проблема).

Однако это событие не вызывается, когда мы перелистываем элементы управления на одной из панелей (например, в текстовых полях) - не совсем то, что на msdn.microsoft.com/en-us/library/system.windows. .forms.scrollablecontrol.scroll.aspx («Событие Scroll возникает, когда пользователь прокручивает клиентскую область, взаимодействуя с полосами прокрутки или когда пользователь перемещается между элементами управления и активными элементами управления, прокручивается в представление.».

Таким образом, фактически панели не синхронизированы: |

Мне известен тот факт, что выделение невидимого элемента управления, содержащегося в прокручиваемом элементе управления, вызывает событие ScrollToControl (Control), которое «делает» новый элемент управления (текстовое поле) видимым. Чтобы дать больше деталей, я могу сказать, что обе панели идентичны (размер и элементы управления).

Как бы вы достигли того, что я ищу?

Ответы [ 3 ]

3 голосов
/ 25 июня 2009

Вот именно то, что вам нужно для прокрутки 2 панелей в SplitContainer . Это будет прокрутка, даже если вы вкладываете элементы управления не в текущем представлении.


this.splitContainer1.Panel1.Paint += new System.Windows.Forms.PaintEventHandler(PanelPaint);
this.splitContainer1.Panel2.Paint += new System.Windows.Forms.PaintEventHandler(PanelPaint);

Point mPrevPan1Pos = new Point();
Point mPrevPan2Pos = new Point();

void PanelPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
   if (splitContainer1.Panel1.AutoScrollPosition != mPrevPan1Pos)
   {
      splitContainer1.Panel2.AutoScrollPosition = new System.Drawing.Point(-splitContainer1.Panel1.AutoScrollPosition.X, -splitContainer1.Panel1.AutoScrollPosition.Y);
      mPrevPan1Pos = splitContainer1.Panel1.AutoScrollPosition;
   }
   else if (splitContainer1.Panel2.AutoScrollPosition != mPrevPan2Pos)
   {
      splitContainer1.Panel1.AutoScrollPosition = new System.Drawing.Point(-splitContainer1.Panel2.AutoScrollPosition.X, -splitContainer1.Panel2.AutoScrollPosition.Y);
      mPrevPan2Pos = splitContainer1.Panel2.AutoScrollPosition;
   }
}
1 голос
/ 13 мая 2015

Я взял ответ от @ SwDevMan81 и округлил его до последней части, необходимой для работы в VS 2012, .Net 4.5.

Часть 1 внутри моего класса:

    #region Synchronize the scrolling of the two panels in the SplitContainer.

    private Point _prevPan1Pos = new Point();
    private Point _prevPan2Pos = new Point();

    void PanelPaint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
        SynchronizeSplitContainerScrollbars();
    }

    private void SynchronizeSplitContainerScrollbars()
    {
        if (splitContainer1.Panel1.AutoScrollPosition != _prevPan1Pos)
        {
            splitContainer1.Panel2.AutoScrollPosition = new System.Drawing.Point(-splitContainer1.Panel1.AutoScrollPosition.X, -splitContainer1.Panel1.AutoScrollPosition.Y);
            _prevPan1Pos = splitContainer1.Panel1.AutoScrollPosition;
        }
        else if (splitContainer1.Panel2.AutoScrollPosition != _prevPan2Pos)
        {
            splitContainer1.Panel1.AutoScrollPosition = new System.Drawing.Point(-splitContainer1.Panel2.AutoScrollPosition.X, -splitContainer1.Panel2.AutoScrollPosition.Y);
            _prevPan2Pos = splitContainer1.Panel2.AutoScrollPosition;
        } 
    }

    #endregion

Часть 2 находится в конструкторе формы. Мне пришлось добавить события для самих событий прокрутки.

        // Setup so we can synchronize the scrolling of the two panels in the SplitContainer.
        splitContainer1.Panel1.Paint += PanelPaint;
        splitContainer1.Panel2.Paint += PanelPaint;
        splitContainer1.Panel1.Scroll += (obj, scrollEventArgs) => SynchronizeSplitContainerScrollbars();
        splitContainer1.Panel2.Scroll += (obj, scrollEventArgs) => SynchronizeSplitContainerScrollbars();
0 голосов
/ 20 мая 2009

Почему бы вам не поместить полностью разделенный контейнер в прокручиваемый элемент вместо того, чтобы помещать элементы прокрутки в разделенный контейнер? Таким образом, они, естественно, совместно используют одну и ту же полосу прокрутки, и разделенный контейнер может быть настолько широким, насколько это необходимо для размещения всей формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...