同时滚动2个面板

时间:2009-05-20 08:53:29

标签: c# .net winforms scroll

我有windows窗体(.net 2.0)控件,里面包含一个splicontainer。 通常,Splitcontainer包含2个面板(标准件)。 Autoscroll设置为true。

我一直在努力实现像这两个面板同步这样的事情,所以滚动其中一个面板也会滚动第二个面板。我实现了它 - 使用Scroll事件(不是问题)。

但是,当我们通过其中一个面板(例如文本框)上的控件进行选项卡时,不会调用此事件 - 这与msdn.microsoft.com/en-us/library/system.windows上的控件完全不同.forms.scrollablecontrol.scroll.aspx(“当用户通过与滚动条交互来滚动客户区域时,或当用户在控件之间导航并且活动控件滚动到视图中时,会发生滚动事件。”。

所以,事实上,面板并没有真正同步:|

我知道这样一个事实,即将焦点放在可滚动控件中包含的不可见控件上会调用它的ScrollToControl(Control)事件,该事件“使”新控件(文本框)可见。为了提供更多细节,我可以说两个面板都是相同的(尺寸和控件)。

你将如何实现我正在寻找的目标?

3 个答案:

答案 0 :(得分:3)

以下是在SplitContainer中滚动2个面板所需的内容。即使您要切换到不在当前视图中的控件,也会滚动。


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 :(得分:1)

我从@ SwDevMan81那里得到了答案,然后用我需要的最后一块来完成它,以便在VS 2012,.Net 4.5中使用它。

第1部分在我的表单类中:

        // 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();

第2部分位于Form的构造函数中。我不得不为Scroll事件本身添加事件。

{{1}}

答案 2 :(得分:0)

为什么不将拆分容器完全放在滚动的东西中,而不是将滚动条放在拆分容器中?这样他们自然地共享相同的滚动条,拆分容器可以根据需要加宽以适应整个表单。