Question

Grâce au code suivant, je crée et ajoute des images - sous forme de vignettes - au FlowLayoutPanel.

La mise en œuvre est assez simple.J'ai lu les images disponibles dans le répertoire et j'appelle la sous-procédure suivante.

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

Maintenant, je voudrais l'étendre.Je voudrais créer l'effet de pagination. L'application doit lire toutes les images disponibles MAIS ne peindre que celles qui sont visibles à l'écran.

Et comme d'habitude, je ne sais pas par où commencer.Puis-je utiliser vos lumières s'il vous plaît?

... et voici la version 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);
}
Était-ce utile?

La solution

Pour accélérer le processus, une fois les images chargées, vous pouvez les mettre en cache afin de ne pas avoir à charger à partir du flux de fichiers chaque fois que vous en avez besoin.

Bien que je ne connaisse pas le code explicite, voici un processus général:

1) Vous pouvez avoir quelques variables, mais la plus importante est un entier pour la page courante.

2) Ensuite, vous devrez définir combien de vignettes seront affichées sur chaque page, soit une constante soit une autre variable Integer. Appelons cela thumbsPerPage

3) Sur les gestionnaires d'événements (OnClick, sur survol ou autres événements d'action que vous souhaitez), procédez comme suit:

4) Effacez le FlowPanel de tous les éléments, probablement similaires à FlowPanel.Controls.Items.Clear ()

5) Ajoutez ensuite les images suivantes pour une page donnée dans la plage: [(currentPage-1) * thumbsPerPage, (currentPage * thumbsPerPage) - 1]

Cela suppose que vous commencez à 0 pour votre index d'image et à 1 pour votre index de page

Exemple, pour 9 images par page: Sur la page 1, vous voulez des images [0,8] Sur la page 2, vous voulez des images [9,17], etc.

donc dans le code, ce serait similaire à

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

Enfin, convertissez votre code en C # :) ... pas obligatoire, mais les utilisateurs sont beaucoup plus disposés à vous aider en général quand ce n'est pas dans VB.NET

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top