SORU
6 Mayıs 2010, PERŞEMBE


Sanallaştırma bir ItemsControl?

Sanal istiyorum ItemsControl Bir veri listesini içeren, ancak VirtualizingStackPanel.IsVirtualizing="True" ItemsControl bir iş gibi görünmüyor.

Farkında olmadığım bu durum yoksa yapmanın bir yolu mu bu?

Ben test etmek için aşağıdaki kod bloğunu kullanıyoruz:

<ItemsControl ItemsSource="{Binding Path=AccountViews.Tables[0]}"
              VirtualizingStackPanel.IsVirtualizing="True">
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <TextBlock Initialized="TextBlock_Initialized"  
                   Margin="5,50,5,50" Text="{Binding Path=Name}" />
    </DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

Eğer ben değiştirmek ItemsControl ListBox görüyorum Initialized olay sadece çalışan bir avuç times (büyük boşlukları da sadece bu yüzden ben sadece gitmek zorunda üzerinden bir kaç kayıtları), ancak bir ItemsControl her öğe alır başlatıldı.

VirtualizingStackPanel ItemsControlPanelTemplate ayarı denedim ama görünmüyor.

CEVAP
6 Mayıs 2010, PERŞEMBE


Aslında sadece ItemsPanelTemplate VirtualizingStackPanel yapım daha var. Varsayılan ItemsControl ControlTemplate yok sanallaştırma anahtarıdır ScrollViewer,. ItemsControl için varsayılan kontrol şablonu (şablon olarak ListBox için kontrol şablonu kullanarak) ekleyerek bize aşağıdaki verir:

<ItemsControl
    VirtualizingStackPanel.IsVirtualizing="True"
    ScrollViewer.CanContentScroll="True"
    ItemsSource="{Binding Path=AccountViews.Tables[0]}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock
                Initialized="TextBlock_Initialized"
                Text="{Binding Path=Name}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Template>
        <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>
    </ItemsControl.Template>
</ItemsControl>

(BTW, varsayılan kontrol şablonları bakmak için harika bir araç Show Me The Template)

Dikkat edilmesi gerekenler:

Neden ScrollViewer.CanContentScroll="True", here bkz.

Ayrıca VirtualizingStackPanel.VirtualizationMode="Recycling" koydum dikkat edin. Bu TextBlock_Initialized ekranda ancak birçok TextBlocks görünür denir kat sayısını azaltır. UI sanallaştırma hakkında daha fazla here okuyabilirsiniz.

EDİT: alenen Unuttum: alternatif bir çözüm olarak, sadece ListBox:) ItemsControl değiştirebilirsiniz Ayrıca, Optimizing Performance on MSDN page şuna ItemsControl değil dikkat edin "Bu Performans Özelliklerini kontrol şablonu düzenlemek için ihtiyacımız var." tablo, Uygulamak Denetimleri

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alex maybury

    alex maybury

    20 Aralık 2007
  • campos9896

    campos9896

    24 Mart 2012
  • o0oCyrusViruso0o

    o0oCyrusViru

    11 Mart 2008