2010-11-17 8 views
2

Mise à jour:Trouver WPF Controls en Viewport

Cela peut être une simple ou une question complexe, mais dans WPF, je ListBox que je remplirai avec un DataTemplate dans une liste.

Existe-t-il un moyen de savoir si un élément de données figure dans la fenêtre, c'est-à-dire que j'ai défilé jusqu'à sa position et qu'il est visible?

Actuellement, j'accroché dans l'événement listbox_ScrollChanged, et cela me donne les ScrollChangedEventArgs, mais je n'ai pas trouvé la bonne propriété ...

Toute aide serait très apprécié, merci!

Répondre

5

Voir this question

Pour un ListBox en particulier, vous pouvez le faire

private bool IsControlVisibleToUser(Control control) 
{ 
    ListBoxItem listBoxItem = 
     listBox.ItemContainerGenerator.ContainerFromItem(control) as ListBoxItem; 
    if (listBoxItem != null) 
    { 
     return IsUserVisible(listBoxItem, listBox); 
    } 
    return false; 
} 

Et la méthode de la question que je lié

private bool IsUserVisible(FrameworkElement element, FrameworkElement container) 
{ 
    if (!element.IsVisible) 
     return false; 
    Rect bounds = element.TransformToAncestor(container).TransformBounds(new Rect(0.0, 0.0, element.ActualWidth, element.ActualHeight)); 
    Rect rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight); 
    return rect.Contains(bounds.TopLeft) || rect.Contains(bounds.BottomRight); 
} 
+0

Cela fonctionnait très bien et semble rapide, merci beaucoup! – cab