1

ListViewを使用してリスト内のアイテムを表示しています。ユーザーは自分でアイテムを選択するか、いくつかの「事前選択キー」を使用して、指定された属性を持つアイテムを選択できます。

アイテムをチェックするために、私はそのようなものを使用します:

for(int i;i<MyListView.Items.Count;++i)
{
    if( /*... Check if the items should be selected ...*/ )
        (MyListView.ItemContainerGenerator.ContainerFromIndex(i) as ListViewItem).IsSelected = true;
}

これは、実行時に表示されるアイテムに対して完全に機能します。ただし、表示されていないアイテムの場合、ContainerFromIndex()はnullを返します。これは仮想化と関係があり、リストは「視野」の上下の項目については知らないと聞きました。しかし、手動で選択したときに、リスト内の「視野」の外にあるアイテムを選択できるようになるのはなぜですか?

そして、「視野」の外でアイテムを選択するにはどうすればよいですか?それは可能だと思います。

助けてくれてありがとう、マークス

4

2 に答える 2

2

あなたが言ったように、私の推測では、問題はListViewアイテムの仮想化です。デフォルトでは、ListView(およびListBox)はVirtualizingStackPanel、パフォーマンスを向上させるためにItemsPanelとして使用します。それがどのように機能するかについての簡単な説明はここで読むことができます。

ただし、別のパネルに置き換えることができます。この場合、通常のStackPanelを使用してみてください。ListViewに大量のアイテムがある場合、特にそれらが複雑なアイテムである場合、パフォーマンスが少し低下する可能性があります。

<ListView>
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

編集

モデルによっては、この同様の質問で説明されている解決策を試すこともできます。ただし、これはおそらく機能しません。

于 2010-05-11T11:17:12.667 に答える
0

アイテムコントロールの仮想化を処理する場合、仮想化を無効にする代わりに(APIの他の部分の正しい操作を妨げる場合でも、実際には便利な機能です)、を見つけVirtualizingPanelて明示的にスクロールするように指示することです。

例えば:

void ScrollToIndex(ListBox listBox, int index)
{
    VirtualizingPanel panel = FindVisualChild<VirtualizingPanel>(listBox);

    panel.BringIndexIntoViewPublic(index);
}

static T FindVisualChild<T>(DependencyObject o) where T : class
{
    T result = o as T;

    if (result != null)
    {
        return result;
    }

    int childCount = VisualTreeHelper.GetChildrenCount(o);

    for (int i = 0; i < childCount; i++)
    {
        result = FindVisualChild<T>(VisualTreeHelper.GetChild(o, i));

        if (result != null)
        {
            return result;
        }
    }

    return null;
}

パネルを見つけるためにビジュアルツリーを検索する必要性にはあまり満足していませんが、仮想化パネルを処理するときにそれを取得したり、特定のインデックスにスクロールしたりする他の方法を知りません。

于 2016-05-26T01:06:51.680 に答える