的代碼,所以我發現,工作相當好,我不知道這是否是把最好的路線,但它似乎很好地工作的解決方案。
在循環播放子節點時的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功能可能會取決於您的實現,但如果其他人是否有麻煩來了一個解決方案,應該是足夠的信息。
我們可以看到「自定義面板」的一些代碼嗎? –
@RohitVats我添加了一個鏈接到面板源代碼。 – OriginalMoose
我現在有同樣的問題。有關它的任何消息? – ygoe