2013-04-14 2 views
1

패널에서 작동하는 가상화 패널을 구현했으며 패널에서 IScrollInfo를 구현합니다. 키보드를 사용하여 작동하도록하는 중입니다. Panel은 ListView에서 ListView.ItemsPanel로 사용됩니다. 사용자가 선택한 항목을 올바르게 누르면 스크롤을하지 않고 마지막으로 표시된 항목에 도달하면 더 이상 길게 누르지 않습니다. 패널이 선택한 항목을 인식하고 적절하게 스크롤하는 방법을 파악하려고합니다. 나는 주위를 검색해 보았지만, 나는 할 수있는 일과 관련된 것을 찾지 못한다. 올바른 방향의 한 점을 크게 높이 평가할 것입니다.WPF VirtualizingWrapPanel 선택한 항목 변경 원인 스크롤

편집 : Here는 그래서, 나는 그것을 취할 수있는 최선의 경로입니다 그러나 잘 작동하는 것 같다 확실하지 않다 꽤 잘 작동하는 솔루션을 발견 VirtualizingWrapPanel

+0

'사용자 정의 패널'에 대한 코드를 볼 수 있습니까? –

+0

@RohitVats Panel 소스에 대한 링크를 추가했습니다. – OriginalMoose

+0

나는 지금 같은 문제가있다. 그것에 관한 어떤 뉴스? – ygoe

답변

0

코드입니다.

아이들을 반복하면서 ArrangeOverride 메서드에서 다음을 수행합니다.

var listViewItem = child as ListViewItem; 
if (listViewItem != null) 
{ 
    listViewItem.Selected -= ListViewItemSelected; 
    listViewItem.Selected += ListViewItemSelected; 
} 

은의 MesureOverride에서 나는 우리가 선택한 이벤트에서 탈퇴해야합니다 여기에 CleanUpItems로 전화를 걸.

var listViewItem = children[i] as ListViewItem; 
if (listViewItem != null) 
{ 
    listViewItem.Selected -= ListViewItemSelected; 
} 

또한 다음 세 가지 기능을 추가했습니다.

private void ListViewItemSelected(object sender, RoutedEventArgs e) 
{ 
    var listViewItem = sender as ListViewItem; 
    if(listViewItem == null) return; 

    var content = listViewItem.Content as CollectionViewGroup; 
    if(content != null) return; //item is a group header dont click 

    var items = ItemContainerGenerator as ItemContainerGenerator; 
    if(items == null) return; 
    BringIndexIntoView(items.IndexFromContainer(listViewItem)); 
    listViewItem.Focus(); 
} 

protected override void BringIndexIntoView(int index) 
{ 
    var offset = GetOffsetForFirstVisibleIndex(index); 
    SetVerticalOffset(offset.Height); 
} 

private Size GetOffsetForFirstVisibleIndex(int index) 
{ 
    int childrenPerRow = CalculateChildrenPerRow(_extent); 
    var actualYOffset = ((index/childrenPerRow) * ChildDimension.Height) - ((ViewportHeight - ChildDimension.Height)/2); 
    if (actualYOffset < 0) 
    { 
     actualYOffset = 0; 
    } 
    Size offset = new Size(_offset.X, actualYOffset); 
    return offset; 
} 

GetOffsetForFirstVisibleIndex 기능은 아마 당신의 구현에 따라 달라질 수 있지만 다른 사람이 문제 해결책을 세우는 데 있다면 그것으로 충분 정보이어야한다.

+0

시도 할 때 선택한 항목은 항상보기 중간에 있습니다. 선택 영역은 테두리와 스크롤 할 때까지 위/아래로 이동하지 않지만 항상 스크롤됩니다. 또한 Up/PageUp 및 Down/PageDown은 항상 한 줄씩 선택 항목을 이동합니다. 그래서 이것은 원래의 문제에 대한 좋은 해결책이 아닌 것 같습니다. – ygoe

+0

@LonelyPixel 스크롤 방법은 구현 방법입니다. 조금 다른 것을 원했지만 GetOffsetForFirstVisibleIndex를 수정하여 원하는대로 만들 수 있습니다. 이 메서드는 단순히 뷰가 스크롤 할 오프셋을 반환합니다. PagesUp 및 PageDown에 관한 한 이러한 컨트롤에는 아무런 사용이 없었습니다 (사용자가 리모컨을 사용하여 키가 제한되어 있음). 따라서 구현과 관련하여 아무 것도하지 않았습니다. 다른 사람들이 선택한 항목이 변경되었다는 알림을 받기 위해 패널을 연결하는 방법을 볼 수 있도록이 코드를 게시했습니다. – OriginalMoose

관련 문제