0

仮想化を実装するカスタム パネルを作成しました。ListBox 内に配置すると、すべて正常に動作します。

ただし、パネルを削除し、仮想化をサポートするために再テンプレート化された ListBox または ItemsControl でデフォルトの VirtualizingStackPanel を使用すると、コントロールは仮想化されません。

仮想化が機能する例:

<ListBox ItemsSource="{Binding Items}" ScrollViewer.CanContentScroll="True">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <CustomVirtualizingPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

仮想化が機能しない例:

<ListBox ItemsSource="{Binding Items}" VirtualizingStackPanel.IsVirtualizing="True"/>

<ListBox ItemsSource="{Binding Items}" ScrollViewer.CanContentScroll="True" VirtualizingStackPanel.IsVirtualizing="True">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

<ItemsControl ItemsSource="{Binding Items}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel IsVirtualizing="True" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Template>
        <ControlTemplate TargetType="{x:Type ItemsControl}">
            <Border BorderThickness="{TemplateBinding BorderThickness}"
                    Padding="{TemplateBinding Padding}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    Background="{TemplateBinding Background}"
                    SnapsToDevicePixels="True">
                <ScrollViewer CanContentScroll="True">
                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </ScrollViewer>
            </Border>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>

コントロールは Window 内に直接配置されます。VirtualizingStackPanel が機能しないのはなぜですか?

4

1 に答える 1

0

3番目の非動作例を取得します。私は自分のプロジェクトの 1 つでこのスタイルを使用していますが、機能しています。

<Style x:Key="VirtualizedItemsControl"
   TargetType="{x:Type ItemsControl}">
<Setter Property="VirtualizingStackPanel.IsVirtualizing"
        Value="True" />
<Setter Property="ScrollViewer.CanContentScroll"
        Value="True" />
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate>
            <Border BorderThickness="{TemplateBinding Border.BorderThickness}"
                    Padding="{TemplateBinding Control.Padding}"
                    BorderBrush="{TemplateBinding Border.BorderBrush}"
                    Background="{TemplateBinding Panel.Background}"
                    SnapsToDevicePixels="True">
                <ScrollViewer Padding="{TemplateBinding Control.Padding}"
                              Focusable="False">
                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                </ScrollViewer>
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>
<Setter Property="ItemsPanel">
    <Setter.Value>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </Setter.Value>
</Setter>

大きな違いはわかりませんが、参考になれば幸いです。

于 2014-03-14T14:21:09.673 に答える