2010-11-17 66 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