none
Wpf Listview taille du rectangle englobant la sélection RRS feed

  • Question

  • Bonjour,

    Je travaille actuellement sur un projet WPF utilisant un listview pour afficher des icônes et un texte en dessous.

    La hauteur des icônes est modifiable à l'aide de binding basé sur un ObservableCollection.

    ItemContainerStyle contient les proprétés suivantes :

     <Setter Property="Width" Value="Auto"/>
     <Setter Property="Height" Value="Auto"/>
      <Setter Property="Margin" Value="{Binding MarginIcon}"/>
      <Setter Property="Padding" Value="0,0,0,0"/>

    Le container du Listview s'adapte parfaitement en fonction de la taille de mon icone.

    Maintenant, en vue d'utiliser un Drag and Drop sur le listview, j'aimerais connaitre la taille du rectangle englobant l'icone et le texte et sa position dans le listeView comme illustré sur l'image.

    Le but est d'insérer un autre item à la position du curseur sur le listView.

    Ou peut-on trouver cette information?




    samedi 25 janvier 2020 09:25

Réponses

  • Après plusieurs essais voici ma solution.

    1.Récupérer les containers des listviewitems à l'aide de :

             selectedContainer = lvIcon.ItemContainerGenerator.ContainerFromIndex(nbItem)

    on peut alors accéder aux propriétés ActualWidth et ActualHeight qui donnent la taille du rectangle englobant

    2. Récupérer l'offset des containers des listviewitems à l'aide de :

             MoveVectorPointIcon = VisualTreeHelper.GetOffset(selectedContainer)

    on peut alors accéder aux décalages X et Y par rapport au coin supérieur gauche du listview


    Dim selectedContainer As ListViewItem
            Dim MoveVectorPointIcon As Vector
            Dim PointIcon As New ArrayList
    
            'Gestion de la dépose de l'icone sur le cadre
            If e.Data.GetDataPresent(DataFormats.FileDrop) Then
    
                Dim PointDrop As Point = e.GetPosition(lvIcon)
    
                'En cas de dépassement des limites du listView par la position du curseur, on replace le curseur sur les bords du listview
                If PointDrop.X < 0 Then PointDrop.X = 0
                If PointDrop.X > lvIcon.ActualWidth Then PointDrop.X = lvIcon.ActualWidth
                If PointDrop.Y < 0 Then PointDrop.Y = 0
                If PointDrop.Y > lvIcon.ActualHeight Then PointDrop.Y = lvIcon.ActualHeight
    
                'Crée un tableau avec les coordonnées X,Y du point supérieur central du rectangle englobant icone et texte
                For nbItem As Integer = 0 To lvIcon.Items.Count - 1
                    'Sélectionne le container de l'item du listview (Icone + texte)
                    selectedContainer = CType(lvIcon.ItemContainerGenerator.ContainerFromIndex(nbItem), ListViewItem)
                    'Sélectionne les coordonnées de l'offset du déplacement de l'item du listView (Icone + texte)
                    MoveVectorPointIcon = VisualTreeHelper.GetOffset(selectedContainer)
    
                    'Ajoute la coordonnée Y du haut du rectangle englobant icone et texte au tableau
                    PointIcon.Add(MoveVectorPointIcon.Y)
                    'Ajoute la coordonnée X du centre haut du rectangle englobant icone et texte au tableau
                    PointIcon.Add(MoveVectorPointIcon.X + (selectedContainer.ActualWidth / 2))
                Next
    
    
    
    Suite ........
    
    
    
    
    
    
    
            End If


     
    samedi 25 janvier 2020 16:45