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

  • Eric Enge

    Eric Enge

    2 Kasım 2009
  • Liberator

    Liberator

    14 EYLÜL 2007
  • warningthepeople

    warningthepe

    21 EYLÜL 2011