2013-04-14 29 views
1

我已經實現了一個工作得很好的虛擬化面板,面板實現了IScrollInfo。我正在使用鍵盤使其工作。面板在ListView中用作ListView.ItemsPanel。當用戶正確按下所選項目時會發生更改,但不會發生滾動,並且當您到達最後一個可見項目時,不能再按下。我想弄清楚如何使面板知道所選項目並適當地滾動。我嘗試過四處搜尋,但似乎找不到與我想要做的事有關的任何事情。正確方向的一個點將不勝感激。WPF VirtualizingWrapPanel所選項目更改原因滾動

編輯:Here對於VirtualizingWrapPanel

+0

我們可以看到「自定義面板」的一些代碼嗎? –

+0

@RohitVats我添加了一個鏈接到面板源代碼。 – OriginalMoose

+0

我現在有同樣的問題。有關它的任何消息? – ygoe

回答

0

的代碼,所以我發現,工作相當好,我不知道這是否是把最好的路線,但它似乎很好地工作的解決方案。

在循環播放子節點時的ArrangeOverride方法中,我執行以下操作。

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

在MeasureOverride中,我打電話給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來使其工作。該方法只是返回視圖將滾動到的偏移量。就PageUp和PageDown而言,我對這些控件沒有用處(我的用戶使用的是遠程控制,因此密鑰是有限的),所以我沒有對它們的實現做任何事情。我只是發佈此代碼,以便其他人可以看到如何連接面板以接收所選項目更改的通知。 – OriginalMoose