плавная прокрутка .net формы - PullRequest
4 голосов
/ 15 сентября 2009

Привет! Я использую формы в .net и динамически добавляю множество связанных ярлыков во время выполнения. Я добавляю эти ссылочные метки на панель и добавляю эту панель в winform. Когда число ссылок не увеличивается, форма выдает автоматическую полосу прокрутки (вертикальная) ... Теперь, когда я прокручиваю вниз с помощью этой автопрокрутки, форма не обновляет свой вид при прокрутке, форма обновляется только тогда, когда я прекращаю прокрутку ... Кроме того, когда он обновляется, он выглядит слишком плохо ... я вижу, как он рисует медленно ....

Кто-нибудь имел дело с этим раньше?

Я пробовал form.refresh () в обработчике события прокрутки, но это, похоже, не помогает ..

Есть какие-нибудь подсказки?

Ответы [ 3 ]

5 голосов
/ 21 марта 2012

Вставьте это в свой класс (UserControl, Panel и т. Д.), Тогда оно будет работать с перетаскиванием пальца.

private const int WM_HSCROLL = 0x114;
private const int WM_VSCROLL = 0x115;

protected override void WndProc (ref Message m)
{
    if ((m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL)
    && (((int)m.WParam & 0xFFFF) == 5))
    {
        // Change SB_THUMBTRACK to SB_THUMBPOSITION
        m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4);
    }
base.WndProc (ref m);
}
4 голосов
/ 29 июня 2013

Если вы не хотите использовать вызовы WinAPI, вы можете сделать это:

// Add event handler to an existing panel
MyPanel.Scroll += new EventHandler(MyPanelScroll_Handler);

// Enables immediate scrolling of contents
private void MyPanelScroll_Handler(System.Object sender, System.Windows.Forms.ScrollEventArgs e)
{
    Panel p = sender As Panel;
    if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll) {
        p.HorizontalScroll.Value = e.NewValue;
    } else if (e.ScrollOrientation == ScrollOrientation.VerticalScroll) {
        p.VerticalScroll.Value = e.NewValue;
    }
}
2 голосов
/ 15 сентября 2009

Попробуйте установить для свойства DoubleBuffered формы значение True.

Обновление : на самом деле, это, вероятно, ничего не даст, так как ваши элементы управления находятся на панели в вашей форме. Встроенный элемент управления Panel не имеет открытого свойства DoubleBuffered, поэтому способ сделать это - добавить имя DBCanel UserControl в ваш проект и изменить код так, чтобы он наследовал от Panel вместо UserControl (вы можете изменить это вручную в файл CS после его добавления). Когда вы добавляете UserControl, код будет выглядеть так:

public partial class DBPanel : UserControl
{
    public DBPanel()
    {
        InitializeComponent();
    }
}

Отредактируйте его так, чтобы он выглядел следующим образом (измените UserControl на Panel и добавьте строку «this.DoubleBuffered = true;» в конструктор):

public partial class DBPanel : Panel
{
    public DBPanel()
    {
        InitializeComponent();
        this.DoubleBuffered = true;
    }
}

Когда вы строите проект, компилятор будет вставлять строку, начинающуюся с "this.AutoScaleMode ...". Удалите эту строку и перестройте.

Теперь вы можете использовать элемент управления DBPanel в своей форме вместо обычной панели, и это должно решить вашу проблему мерцания.

Обновление 2 : извините, я недостаточно внимательно прочитал ваш вопрос. Вы правы, Панель не перерисовывает себя, пока вы не отпустите большой палец полосы прокрутки. Я думаю, что для достижения этого эффекта вам просто нужно создать свой собственный UserControl.

По сути, вы бы просто имели UserControl с пристыкованной VScrollBar справа и Panel с AutoScroll = false, пристыкованной слева, занимающей оставшуюся часть пространства. События Scroll и ValueChanged в VScrollBar запускаются при перемещении большого пальца вверх и вниз, поэтому после добавления группы LinkLabels к внутренней панели вы можете использовать эти события, чтобы изменить верхнюю позицию панели и, таким образом, добиться эффекта динамической прокрутки. Вы ищете.

Отчасти раздражает, что Panel по умолчанию не работает таким образом, или даже имеет настройку, которая ее включает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...