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



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

我该怎么办?

欢迎提出建议

我将有一个复合滚动类的方法AddScrollbar。这个类订阅你添加的每个滚动条的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);
    }
}

这是一个想法,你可以改变滚动条的类型与你正在使用的包含滚动条(可能是一个普通的旧UserControl)。

希望能有所帮助。

我做了一个快速测试,将两个垂直滚动条并排放置。我将以下表单的处理程序附加到每个滚动条的Scroll事件,以便使每个滚动条都遵循另一个:

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

在您的例子中(用户控件),我将:

  1. 在你的Scope控制:暴露Scroll事件和ScrollPosition属性。该事件将内部Scope滚动条事件转发给表单。
  2. 在表单中,订阅每个Scope控件的事件(一个用于所有Scope发生的公共处理程序,如上所示)
  3. 在处理程序中,根据滚动事件参数
  4. 为每个Scope!=sender设置ScrollPosition

指出:

    以编程方式设置滚动条的值不会触发该滚动条上的Scroll事件。因此这段代码不会进入无限循环。当然,如果Scope同时具有水平和垂直滚动条,您将需要2个事件(或事件参数表示水平或垂直)和2个属性:HorizScrollPositionVertScrollPosition

最新更新