2014-04-24 28 views
0

我有一個GridView。我正在使用嵌套的ScrollViewerSnapPoints將每個記錄捕捉到視圖中。因爲這只是一個視覺上的變化,而不是數據變化,所以我怎樣才能確定哪些記錄是當前可見的?類似SelectedItem,但是是一個可視化查詢。我可以檢查每個記錄,但似乎效率低下。想法?ScrollViewer中可見什麼?

+0

你需要什麼東西是真正可見的,還是足以讓東西虛擬化(當前有'GridViewItems')? –

+0

有趣的是 - 我今天實際上需要同樣的功能(今晚)。我可能會使用擴展方法... –

+0

您是否找到了解決方法? –

回答

1

你的情況,你可以使用從WinRT的XAML工具包VisualTreeHelperExtensions,做這樣的事情

gridView 
    .GetDescendantsOfType<GridViewItem>() 
    .Select(gvi => gridView.ItemFromContainer(gvi)); 

它確實有點密集的視覺樹搜索,但如果你的GridView使用虛擬化,因爲可能是爲您的方案確定返回的項目在視圖端口中或附近。如果你想更精確,你可以測試邊界矩形交點。像這樣的東西可能就足夠了:

static class RectExtensions 
{ 
    public static bool ContainsPartOf(this Rect bigRect, Rect smallRect) 
    { 
     // this is a very targeted test for horizontally scrollable smallRects inside of a bigRect 
     return bigRect.Left < smallRect.Left && bigRect.Right > smallRect.Left || 
       bigRect.Left < smallRect.Right && bigRect.Right > smallRect.Right; 
    } 
} 

var sv = gridView.GetFirstDescendantOfType<ScrollViewer>(); 
var bigRect = new Rect(0, 0, sv.ActualWidth, sv.ActualHeight); 

gridView 
    .GetDescendantsOfType<GridViewItem>() 
    .Where(gvi => bigRect.ContainsPartOf(gvi.GetBoundingRect(sv))) 
    .Select(gvi => gridView.ItemFromContainer(gvi)); 
+0

在這種情況下,爲什麼不使用Items?或者如果你有約束力,可以投射ItemsSource? –

+1

那麼,如果你的列表被虛擬化了,那麼可視化樹中的'GridViewItems'就在視口中或附近,所以它們基本上與「當前可見」幾乎相同。如果您需要查看視覺樹中的哪些 - 您可以抓住它們的邊界矩形並查看它們是否位於視圖端口內。 –

+0

我希望它更容易 –