2010-11-17 72 views
2

更新时间:查找WPF控件在视口中

这可能是一个简单的或复杂的问题,但在WPF中,我有一个列表框,我填补了的DataTemplate从列表中。

有没有办法找出一个特定的datatemplate项目是否在视口中,即我已经滚动到它的位置并且它是可见的?

目前我迷上到listbox_ScrollChanged事件,这一点让我ScrollChangedEventArgs,但我还没有找到合适的物业...

任何帮助,将不胜感激,谢谢!

回答

5

this问题

对于具体的一个列表框,你可以做到这一点

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

而且从这个问题我联系

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

这伟大的工作,似乎快的方法,由于非常许多! – cab 2010-11-17 13:36:23