使用一个备忘录编辑滚动也可以滚动另一个备忘录

时间:2011-03-02 20:42:12

标签: scroll devexpress

我有两个类似的备忘录(为了比较两个记录)我想保持滚动同步以便于比较。

我原本以为会有一个OnScroll事件,但没有看到一个,也没有看到任何类似的东西,我看到的最接近的是旋转,它处理了一些可能性,但不是全部。

我也没有看到导航行的方法。

我确实看到了ScrollToCaret方法,但这不符合我的要求。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这可以仅使用反射来实现。以下是显示如何同步垂直滚动条位置的代码:

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