我写了一个类继承UserControl。我使用一些Scope绘制一些具有相同时间戳的数字。所以我想在滚动其中一个时滚动所有Scope。 我想我只是将OnScroll方法设为静态,但它不起作用。
我该怎么办?
欢迎任何建议。
答案 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;
}
在您的情况下(用户控件),我会:
Scope
控件中:公开Scroll
事件和ScrollPosition
属性。该事件将内部范围滚动条事件转发到表单。Scope
控件的事件(所有Scope
出现的一个常见处理程序,如上所示)ScrollPosition
设置Scope!=sender
醇>
注意:
Scroll
事件。因此,此代码不会进入无限循环。Scope
同时包含horiz和vert滚动条,则需要2个事件(或表示horiz或vert的事件参数)和2个属性:HorizScrollPosition
和{{1 }}。