我写了一个类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;
}
在您的例子中(用户控件),我将:
- 在你的
Scope
控制:暴露Scroll
事件和ScrollPosition
属性。该事件将内部Scope滚动条事件转发给表单。 - 在表单中,订阅每个
Scope
控件的事件(一个用于所有Scope
发生的公共处理程序,如上所示) - 在处理程序中,根据滚动事件参数 为每个
Scope!=sender
设置ScrollPosition
指出:
- 以编程方式设置滚动条的值不会触发该滚动条上的
Scroll
事件。因此这段代码不会进入无限循环。当然,如果Scope
同时具有水平和垂直滚动条,您将需要2个事件(或事件参数表示水平或垂直)和2个属性:HorizScrollPosition
和VertScrollPosition
。