2011-04-25 7 views
1

J'ai un framework Drag-Drop dans lequel le support de défilement est déjà présent (Pixel by Pixel scrolling). Cela fonctionne bien dans le cas où la virtualisation n'est pas activée, mais si elle est activée, elle devient foirée.
Comme la logique de défilement est basée sur la taille de Viewport et selon MSDN, nous avons -Consolidated Scrolling - "Pixel par Pixel" + "Article par article"

MSDN- Si CanContentScroll est vrai, les valeurs des propriétés ExtentHeight, ScrollableHeight, ViewportHeight et VerticalOffset sont nombre d'éléments . Si CanContentScroll est défini sur false, les valeurs de ces propriétés sont Pixels indépendants du périphérique. En outre, si la virtualisation est activée, ExtentHeight représente le nombre total d'éléments dans ScrollViewer et la hauteur de la fenêtre d'affichage représente le nombre d'éléments actuellement visibles.

travail force le défilement donc je veux quelque chose like--

ScrollToContent(ScrollViewer, CurrentMousePositionWRTScrollViewer) 
{ 
    if(ScrollViewer's Viewport Height is in terms of Pixel) 
{ 
----------Do Pixel by Pixel Scrolling -------- 
} 
else if(ScrollViewer's Viewport Height represents number of items visible) 
{ 
--------- Do Item by Item Scrolling --------- 
} 

J'ai essayé de mettre l'enregistrement de « CanContentScroll = false », la virtualisation de contrôle est activé ou non, mais même que le travail de force parce que je trouve que un même si CanContentScroll est vrai Viewport height dint représente le nombre d'éléments visibles mais est égal à la hauteur réelle. Cependant, sur une autre liste, elle montre le nombre d'éléments visibles.

code réel de défilement -

private void ScrollToContent(ScrollViewer scrollViewer, Point point) 
    { 
     double verticalScrollOffset = 0.0; 
     double scrollDifference = 30.0; 
     double scrollDefaultOffset = 40.0; 

     if (scrollViewer == null) return; 
     if (scrollViewer.ViewportHeight != scrollViewer.ExtentHeight) 
     { 
       if (scrollViewer.ViewportHeight - point.Y < scrollDifference) 
       { 
        // See if we need to scroll down 
        verticalScrollOffset = scrollDefaultOffset; 
       } 
       else if (point.Y < scrollDifference) 
       { 
        // See if we need to scroll up 
        verticalScrollOffset = -scrollDefaultOffset; 
       } 
       // Scroll up or down 
       if (verticalScrollOffset != 0.0) 
       { 
        verticalScrollOffset += scrollViewer.VerticalOffset; 
        if (verticalScrollOffset < 0.0) 
        { 
         verticalScrollOffset = 0.0; 
        } 
        else if (verticalScrollOffset > scrollViewer.ScrollableHeight) 
        { 
         verticalScrollOffset = scrollViewer.ScrollableHeight; 
        } 
        scrollViewer.ScrollToVerticalOffset(verticalScrollOffset); 
       } 
     } 
    } 

J'étais dans l'illusion que la virtualisation est coupable, mais après avoir vérifié la propriété de IsVirtualization, j'ai remarqué que la virtualisation est pas un problème ici (son vrai pour les deux listboxes) .. Toute idée quel peut être le cas possible ??
question est - j'ai 2 listboxes (presque similaire) Dans un cas, je reçois ViewPort Taille == Nombre d'éléments visibles Cependant, dans d'autres cas ViewPort Taille = Taille réelle ..

Qu'est-ce que peut être la raison possible ??

Répondre

0

Answer Actual Height Vs Viewport Height and Scrolling Issue

code: je l'élément sélectionné à perfrom point par point le défilement dans le cas de la virtualisation a permis

// Manage vertical scrolling. 
     if (scrollViewer.ViewportHeight != scrollViewer.ExtentHeight) 
     { 
      // NOTE :MSDN- If CanContentScroll is true, the values of the ExtentHeight, ScrollableHeight, ViewportHeight, and VerticalOffset 
      // properties are number of items. If CanContentScroll is false, the values of these properties are Device Independent Pixels. 
      // Also If Virtualization is Enabled then ExtentHeight Represents - TotalNumber of Items in ScrollViewer and Viewport Height 
      // Represents Count of Items currently visible. 
      if (scrollViewer.CanContentScroll == false) 
      { 
       if (scrollViewer.ViewportHeight - point.Y < scrollDifference) 
       { 
        // See if we need to scroll down 
        verticalScrollOffset = scrollDefaultOffset; 
       } 
       else if (point.Y < scrollDifference) 
       { 
        // See if we need to scroll up 
        verticalScrollOffset = -scrollDefaultOffset; 
       } 

       // Scroll up or down 
       if (verticalScrollOffset != 0.0) 
       { 
        verticalScrollOffset += scrollViewer.VerticalOffset; 

        if (verticalScrollOffset < 0.0) 
        { 
         verticalScrollOffset = 0.0; 
        } 
        else if (verticalScrollOffset > scrollViewer.ScrollableHeight) 
        { 
         verticalScrollOffset = scrollViewer.ScrollableHeight; 
        } 

        scrollViewer.ScrollToVerticalOffset(verticalScrollOffset); 
       } 
      } 
      else 
      { 
       if (scrollViewer != null) 
       { 
        // To ControlScrolling Speed - as we're doing Item By Item Scrolling now, it would be quite fast so add a time gap. 
        if (DateTime.Now.Subtract(lastScrollTime).TotalMilliseconds > 200) 
        { 
         if (scrollViewer.ActualHeight - point.Y < scrollDifference) 
         { 
          // See if we need to scroll down 
          verticalScrollOffset = scrollDefaultOffset; 
         } 
         else if (point.Y < scrollDifference) 
         { 
          // See if we need to scroll up 
          verticalScrollOffset = -scrollDefaultOffset; 
         } 

         if (verticalScrollOffset != 0.0) 
         { 
          // Scroll Content upwards 
          if (verticalScrollOffset < 0 && scrollViewer.VerticalOffset > 0) // Also check if there are any non visible elements in scrollviewer 
          { 
           scrollViewer.LineUp(); 
           lastScrollTime = DateTime.Now; 
          } 
          else if (verticalScrollOffset > 0 && 
           scrollViewer.VerticalOffset < scrollViewer.ExtentHeight - scrollViewer.ViewportHeight) 
          { 
           scrollViewer.LineDown(); 
           lastScrollTime = DateTime.Now; 
          } 
         } 
        } 
       } 
      } 
     } 
+0

Salut Rohit, votre code défile-t-il pixel par pixel même lorsque la virtualisation est activée et que CanContentScroll = True? Et où avez-vous branché cette méthode? SelectedItemChanged ou défilement? –

+0

Leo, je suis désolé mais j'ai eu ce problème depuis longtemps et je ne travaille plus sur ce projet. Je ne me souviens pas trop. – Rohit

1
bool isVirtualizing = (bool)scrollViewer.GetValue(VirtualizingStackPanel.IsVirtualizingProperty); 
VirtualizationMode mode = (VirtualizationMode)scrollViewer.GetValue(VirtualizingStackPanel.VirtualizationModeProperty); 
+0

Eh bien Merci !! Je pensais que la virtualisation est le coupable ici parce que le défilement ne fonctionne pas. – Rohit

Questions connexes