Использование прокрутки для редактирования одной заметки, чтобы прокрутить и другую. - PullRequest
1 голос
/ 02 марта 2011

У меня есть два похожих комментария (для сравнения двух записей). Я бы хотел синхронизировать прокрутку, чтобы упростить сравнение.

Я изначально думал, что будет событие OnScroll,но я не видел ни одного, ни чего-либо подобного, ближе всего я видел Spin, он обрабатывает некоторые возможности, но не все.

Я также не видел способа навигации по строкам.

Я видел метод ScrollToCaret, но он не делает то, что я хочу.

Есть идеи?

1 Ответ

2 голосов
/ 03 марта 2011

Это может быть реализовано с использованием только отражения. Вот код, показывающий, как синхронизировать положение вертикальной полосы прокрутки:

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 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...