1

かなりうまく機能する仮想化パネルを実装しました。このパネルは IScrollInfo を実装しています。私はキーボードを使用してそれを動作させる過程にあります。Panel は、ListView.ItemsPanel として ListView で使用されます。ユーザーが選択した項目を正しく押し下げると、スクロールは行われず、最後の表示項目に到達すると、それ以上押し下げることができなくなります。選択した項目をパネルに認識させ、適切にスクロールする方法を見つけようとしています。いろいろ調べてみましたが、自分のやりたいことに関連するものが見つからないようです。正しい方向へのポイントは大歓迎です。

編集:VirtualizingWrapPanelのコードは次のとおりです

4

1 に答える 1

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;
}

また、以下の3つの機能を追加しました。

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 関数は、おそらく実装によって異なりますが、他の誰かが解決策を考え出すのに問題がある場合は、それで十分な情報になるはずです。

于 2013-09-08T16:06:50.320 に答える