2014-01-15 14 views
0

UI元素的具有相同高度的名單加入到WrapPanel,而XAML是如何獲取WrapPanel的第一行中的項目數?

<Grid> 
    <ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
     <ListView.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel /> 
      </ItemsPanelTemplate> 
     </ListView.ItemsPanel> 
    </ListView > 
</Grid> 

在運行時它看起來像這樣

enter image description here

爲了獲得項目計數第一行,我試圖通過比較每個項目的垂直偏移量與第一項目來計算每個項目的左上角的座標(相對於列表視圖),我可以得到第一行的項目數。

但是,如果項目具有不同的高度,代碼很容易破壞。

ListView listView = (sender as ListView); 
if (listView.Items.Count > 0) 
{ 
    UIElement firstItem = ((listView.Items)[0] as UIElement); 
    double y = firstItem.TranslatePoint(new Point(0, 0), listView).Y; 

    int counter = 0; 
    foreach (UIElement item in listView.Items) 
    { 
     if ((item.TranslatePoint(new Point(0, 0), listView).Y != y)) 
     { 
      break; 
     } 
     counter++; 
    } 
} 

這樣做的正確方法是什麼?

+0

在後的截圖是[鏈接](http://i.stack.imgur.com/EhTHK.png),對不起,我有麻煩EDITTING我的帖子... – kennyzx

+0

如果項目不是UIElements,代碼當然會失敗。你至少應該使用'ListView.ItemContainerGenerator.ContainerFromItem'。 – Clemens

+3

爲什麼不只是檢查當前項目的位置的X值是否小於或等於前一個的值。這將是一個包裝發生的指標。 – Clemens

回答

2

這個方法應該把工作做好:

private static int GetItemsInFirstRow(ItemsControl itemsControl) 
{ 
    double previousX = -1; 
    int itemIndex; 

    for (itemIndex = 0; itemIndex < itemsControl.Items.Count; itemIndex++) 
    { 
     var container = (UIElement)itemsControl.ItemContainerGenerator 
               .ContainerFromIndex(itemIndex); 

     var x = container.TranslatePoint(new Point(), itemsControl).X; 

     if (x <= previousX) 
     { 
      break; 
     } 

     previousX = x; 
    } 

    return itemIndex; 
}