2013-01-18 11 views
5

Mam UserControl, która musi zawierać kilka kontrolek na górze i LongListSelector poniżej. Całkowita wysokość całego obiektu UserControl może (i prawie zawsze będzie) przekraczać wysokość ekranu, w takim przypadku cały obiekt musi być przewijany.Wydajność LongListSelector jest bardzo zła, gdy jest zawarta w ScrollViewer

Moja obecna konfiguracja jest następująca:

<staff:UserContentControl 
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:controls="clr-namespace:MyApp.Controls" 
    xmlns:staff="clr-namespace:MyApp.Helpers" 
    x:Class="MyApp.Controls.RemoteHomePage" 

    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    FontFamily="{StaticResource PhoneFontFamilyNormal}" 
    FontSize="{StaticResource PhoneFontSizeNormal}"> 

    <ScrollViewer> 
     <ScrollViewer.Content> 
      <StackPanel> 
       <TextBlock Txt="Text1" Sign="@" /> 
       <TextBlock Txt="Text2" Sign="#" /> 
       <controls:Divider /> 

       <TextBlock Txt="Text3" Sign="~" /> 
       <TextBlock Txt="Text4" Sign="~" /> 
       <controls:TextDivider Text="Divider text" /> 

       <phone:LongListSelector ItemsSource="{Binding Items}"> 
        <phone:LongListSelector.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Title}" /> 
         </DataTemplate> 
        </phone:LongListSelector.ItemTemplate> 
       </phone:LongListSelector> 
      </StackPanel> 
     </ScrollViewer.Content> 
    </ScrollViewer> 
</staff:UserContentControl> 

Rozwiązanie to spełnia moje potrzeby, ale też nie jest to duży problem: obecnie LongListSelector zajmuje naprawdę dużo czasu, aby załadować, gdy ilość elementów w niej zawartych jest dość duża. Przetwarzanie 300 elementów zajmuje 8 sekund, aw tym czasie cały interfejs jest blokowany. Jeśli usunąć wszystko, ale LongListSelector, tak:

<staff:UserContentControl 
    ...> 

    <phone:LongListSelector ItemsSource="{Binding Items}"> 
     <phone:LongListSelector.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Title}" /> 
      </DataTemplate> 
     </phone:LongListSelector.ItemTemplate> 
    </phone:LongListSelector> 
</staff:UserContentControl> 

następnie LongListSelector ładunki prawie natychmiast nawet ze znacznie większej ilości przedmiotów. Ale oczywiście potrzebuję tych innych kontroli nad nim, więc pytanie, co mogę zrobić, aby rozwiązać ten problem?

(związanych również pytanie: Bałem się, że LongListSelector wewnątrz ScrollViewer może spowodować podwójne przewijanie czy coś takiego, ale ostatecznie wszystko skończyło się dobrze pod tym względem nie jestem pewien, czy LongListSelector jakoś wie, że jest w środku drugiej przewijania. kontrolować lub jeśli zdarzy się coś innego, czego nie jestem świadomy, niektóre wyjaśnienia, dlaczego działa dobrze, chociaż bardzo powolnie, byłyby bardzo doceniane.)

+1

Robisz to źle. –

+0

@MathiasLykkegaardLorenzen :) – Anton

Odpowiedz

13

Nie używaj przewijania widza ponieważ uczyni to longlistselector że to ma nieskończenie wysoki ekran dostępne i czynią wszystkie jego elementy. Zamiast tego, aby rozwiązać problem, użyj właściwości Nagłówek i Stopka, aby dodać dane powyżej lub poniżej pozycji na liście.

1

Nie można zmusić ScrollViewera do wirtualizacji elementów LongListSelector.

Musisz więc naśladować zachowanie tylko za pomocą LongListSelector.

Pierwszy element zawiera wszystkie wymagane elementy z StackPanel (1 pozycja szablonu). I inne elementy będą podstawowymi elementami LongListSelector (2'nd itemtemplate).

Oto wytłumaczenie jak ustawić różne szablony do przedmiotów: Styling a selected ListViewItem in Windows 8 CP

Powiązane problemy