Как реализовать эффект подкачки в элементе управления FlowLayoutPanel? - PullRequest
1 голос
/ 03 февраля 2011

Благодаря следующему коду я создаю и добавляю изображения в виде эскизов в панель FlowLayout.

Реализация довольно проста. Я прочитал доступные изображения в каталоге и вызвал следующую подпроцедуру.

Private Sub LoadImages(ByVal FlowPanel As FlowLayoutPanel, ByVal fi As FileInfo)
        Pedit = New DevExpress.XtraEditors.PictureEdit
        Pedit.Width = txtIconsWidth.EditValue
        Pedit.Height = Pedit.Width / (4 / 3)
        Dim fs As System.IO.FileStream
        fs = New System.IO.FileStream(fi.FullName, IO.FileMode.Open, IO.FileAccess.Read)
        Pedit.Image = System.Drawing.Image.FromStream(fs)
        fs.Close()
        fs.Dispose()
        Pedit.Properties.SizeMode = DevExpress.XtraEditors.Controls.PictureSizeMode.Zoom

        If FlowPanel Is flowR Then
            AddHandler Pedit.MouseClick, AddressOf Pedit_MouseClick
            AddHandler Pedit.MouseEnter, AddressOf Pedit_MouseEnter
            AddHandler Pedit.MouseLeave, AddressOf Pedit_MouseLeave
        End If

        FlowPanel.Controls.Add(Pedit)
    End Sub

Теперь я хотел бы расширить его. Я хотел бы создать эффект пейджинга. Приложение должно прочитать все доступные изображения, НО рисовать только те, которые видны на экране.

И, как обычно, я не знаю, с чего начать. Могу ли я использовать ваши огни, пожалуйста?

... и вот версия C #!

private void LoadImages(FlowLayoutPanel FlowPanel, FileInfo fi)
{
    Pedit = new DevExpress.XtraEditors.PictureEdit();
    Pedit.Width = txtIconsWidth.EditValue;
    Pedit.Height = Pedit.Width / (4 / 3);
    System.IO.FileStream fs = null;
    fs = new System.IO.FileStream(fi.FullName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
    Pedit.Image = System.Drawing.Image.FromStream(fs);
    fs.Close();
    fs.Dispose();
    Pedit.Properties.SizeMode = DevExpress.XtraEditors.Controls.PictureSizeMode.Zoom;

    if (object.ReferenceEquals(FlowPanel, flowR)) {
        Pedit.MouseClick += Pedit_MouseClick;
        Pedit.MouseEnter += Pedit_MouseEnter;
        Pedit.MouseLeave += Pedit_MouseLeave;
    }

    FlowPanel.Controls.Add(Pedit);
}

1 Ответ

0 голосов
/ 03 февраля 2011

Чтобы ускорить процесс, после загрузки изображений вы можете их кэшировать, чтобы вам не приходилось загружать их из потока файлов каждый раз, когда они вам нужны.

Пока я не знаю явного кода, вот общий процесс:

1) У вас может быть несколько переменных, но наиболее важной является Integer для currentPage.

2) Затем вам нужно определить, сколько миниатюр будет отображаться на каждой странице, либо константа, либо другая целочисленная переменная. Давайте назовем это thumbsPerPage

3) В обработчике событий (OnClick, при наведении курсора или других желаемых событиях) выполните следующие действия:

4) Очистить FlowPanel от всех элементов, вероятно, сродни FlowPanel.Controls.Items.Clear ()

5) Затем добавьте следующие изображения для данной страницы в пределах диапазона: [(currentPage-1) * thumbsPerPage, (currentPage * thumbsPerPage) - 1]

Предполагается, что вы начинаете с 0 для индекса изображения и с 1 для индекса страницы

Пример, для 9 изображений на странице: На странице 1 вы хотите изображения [0,8] На странице 2 вы хотите изображения [9,17] и т. Д.

так в коде это будет похоже на

FlowPanel.Items.Clear()
for(int i = (currentPage-1) * thumbsPerPage; i < (currentPage * thumbsPerPage) - 1; i++)
   FlowPanel.Controls.Add(Pedits[i])

Наконец, конвертируйте ваш код в C #:) ... не обязательно, но пользователи гораздо охотнее помогают, когда его нет в VB.NET

...