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 ??
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? –
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