Это может быть реализовано с использованием только отражения. Вот код, показывающий, как синхронизировать положение вертикальной полосы прокрутки:
using System.Reflection;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.ScrollHelpers;
DevExpress.XtraEditors.ScrollHelpers.ScrollBarEditorsAPIHelper helper1, helper2;
private void RibbonForm1_Load(object sender, EventArgs e) {
FieldInfo fi = typeof(MemoEdit).GetField("scrollHelper", BindingFlags.NonPublic | BindingFlags.Instance);
helper1 = fi.GetValue(memoEdit1) as DevExpress.XtraEditors.ScrollHelpers.ScrollBarEditorsAPIHelper;
helper2 = fi.GetValue(memoEdit2) as DevExpress.XtraEditors.ScrollHelpers.ScrollBarEditorsAPIHelper;
helper1.VScroll.ValueChanged += new EventHandler(VScroll_ValueChanged);
helper2.VScroll.ValueChanged += new EventHandler(VScroll_ValueChanged);
}
void VScroll_ValueChanged(object sender, EventArgs e) {
DevExpress.XtraEditors.VScrollBar scrollBar = sender as DevExpress.XtraEditors.VScrollBar;
ScrollEventArgs args = new ScrollEventArgs(ScrollEventType.ThumbPosition, scrollBar.Value);
MemoEdit memo = ((MemoEdit)scrollBar.Parent);
ScrollBarEditorsAPIHelper helper = helper1;
if(memo == memoEdit1)
helper = helper2;
helper.VScroll.Value = scrollBar.Value;
MethodInfo mi = typeof(ScrollBarEditorsAPIHelper).GetMethod("UpdateOriginalScroll", BindingFlags.NonPublic | BindingFlags.Instance);
mi.Invoke(helper, new object[] { args, false });
}
Если вы также хотите синхронизировать положение горизонтальных полос прокрутки, вы должны подписаться на событие HScrollbar.ValueChanged. Код должен быть почти таким же, за исключением последней строки:
mi.Invoke(helper, new object[] { args, true });