2014-01-15 2 views
0

같은 높이 UiElements의 목록은 WrapPanel에 추가하고, 실행이의 항목 수를 얻기 위해이WrapPanel의 첫 번째 행에서 항목 수를 계산하는 방법은 무엇입니까?

enter image description here

과 같은 경우 XAML은

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

입니다 첫 번째 행, 각 항목의 왼쪽 위 모퉁이의 좌표 (목록 뷰 기준)를 계산하려고했는데 각 항목의 세로 오프셋을 첫 번째 항목과 비교하여 첫 번째 행의 항목 수를 얻을 수 있습니다.

그러나 항목의 높이가 다른 경우 코드가 쉽게 손상 될 수 있습니다.

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 값이 이전 위치의 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; 
} 
관련 문제