如何链接一组控件的滚动条位置?

时间:2011-12-28 05:56:56

标签: c# winforms scroll

我写了一个类继承UserControl。我使用一些Scope绘制一些具有相同时间戳的数字。所以我想在滚动其中一个时滚动所有Scope。 我想我只是将OnScroll方法设为静态,但它不起作用。

我该怎么办?

欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

我将使用方法AddScrollbar的CompositeScroll类。此类会对您添加的每个滚动条的OnScroll产生影响,并使其他滚动条更改其位置。像这样:

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);
    }
}

这是一个想法,您可以使用包含滚动条的滚动条类型更改滚动条类型(也许是一个普通的旧用户控件)。

希望它有所帮助。

答案 1 :(得分:0)

我做了一个快速测试,并排放置了2个垂直滚动条。我将以下表单的处理程序附加到每个滚动条的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. 在处理程序中,根据滚动事件args
  4. 为每个ScrollPosition设置Scope!=sender

    注意:

    1. 以编程方式设置滚动条的值不会触发该滚动条上的Scroll事件。因此,此代码不会进入无限循环。
    2. 当然,如果Scope同时包含horiz和vert滚动条,则需要2个事件(或表示horiz或vert的事件参数)和2个属性:HorizScrollPosition和{{1 }}。