Вы посмотрели Образцы MVC на CodePlex? У Rob Conery есть некоторые экранные демонстрации, которые соглашаются с созданием сайта по телефону http://blog.wekeroad.com/mvc-storefront/ .
Некоторое время назад я сделал это для небольшого проекта, и вот простое решение, которое я нашел.
Создайте новый элемент управления путем создания подкласса RichTextBox:
public class SynchronizedScrollRichTextBox : System.Windows.Forms.RichTextBox
{
public event vScrollEventHandler vScroll;
public delegate void vScrollEventHandler(System.Windows.Forms.Message message);
public const int WM_VSCROLL = 0x115;
protected override void WndProc(ref System.Windows.Forms.Message msg) {
if (msg.Msg == WM_VSCROLL) {
if (vScroll != null) {
vScroll(msg);
}
}
base.WndProc(ref msg);
}
public void PubWndProc(ref System.Windows.Forms.Message msg) {
base.WndProc(ref msg);
}
}
Добавьте новый элемент управления в форму и для каждого элемента управления явным образом уведомите другие экземпляры элемента управления об изменении его положения vScroll. Примерно так:
private void scrollSyncTxtBox1_vScroll(Message msg) {
msg.HWnd = scrollSyncTxtBox2.Handle;
scrollSyncTxtBox2.PubWndProc(ref msg);
}
Я думаю, что у этого кода есть проблемы, если все «связанные» элементы управления не имеют одинакового количества отображаемых строк.
Спасибо, Джей за ответ; после еще нескольких поисков я также нашел метод, описанный здесь . Я опишу это ниже для всех, кто интересуется.
Сначала объявите следующие перечисления:
public enum ScrollBarType : uint {
SbHorz = 0,
SbVert = 1,
SbCtl = 2,
SbBoth = 3
}
public enum Message : uint {
WM_VSCROLL = 0x0115
}
public enum ScrollBarCommands : uint {
SB_THUMBPOSITION = 4
}
Затем добавьте внешние ссылки на GetScrollPos
и SendMessage
.
[DllImport( "User32.dll" )]
public extern static int GetScrollPos( IntPtr hWnd, int nBar );
[DllImport( "User32.dll" )]
public extern static int SendMessage( IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam );
Наконец, добавьте обработчик событий для события VScroll
соответствующего RichTextBox
:
private void myRichTextBox1_VScroll( object sender, EventArgs e )
{
int nPos = GetScrollPos( richTextBox1.Handle, (int)ScrollBarType.SbVert );
nPos <<= 16;
uint wParam = (uint)ScrollBarCommands.SB_THUMBPOSITION | (uint)nPos;
SendMessage( richTextBox2.Handle, (int)Message.WM_VSCROLL, new IntPtr( wParam ), new IntPtr( 0 ) );
}
В этом случае положение вертикальной прокрутки richTextBox2
будет синхронизировано с richTextBox1
.