it-swarm.com.ru

ListView в Windows Phone 8.1 Колебания при прокрутке длинного списка (XAML)

У меня проблемы с прокруткой ListViews в моем приложении для Windows Phone 8.1. Короткие списки прокручиваются просто отлично, но плавно прокручиваются, как только виртуализация пинает весь ListView, слегка отклоняясь влево, но достаточно заметная, чтобы раздражать. 

Я попытался удалить все переходы безрезультатно, а также с постепенной загрузкой элементов, но безуспешно. Установка панели элементов в StackPanel (удаление виртуализации) устраняет проблему, но не является предпочтительной.

Мои списки просмотра привязываются к свойству в DefaultViewModel, которое поставляется с базовым шаблоном страницы.

Что я делаю не так и что заставляет мои ListViews проявлять такое поведение?

XAML:

<ListView x:Name="searchResultsList" IsItemClickEnabled="True" ItemClick="ListView_ItemClick" ItemsSource="{Binding searchResults}">
   <ListView.ItemContainerStyle>
      <Style TargetType="ListViewItem">
          <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
          <Setter Property="Margin" Value="0,0,0,20" />
      </Style>
   </ListView.ItemContainerStyle>
   <ListView.ItemTemplate>
      <DataTemplate>
          <Grid>
             <Grid.ColumnDefinitions>
                <ColumnDefinition Width="80" />
                <ColumnDefinition Width="10" />
                <ColumnDefinition Width="*" />
             </Grid.ColumnDefinitions>

             <Border Width="80" Height="80">
                <Image Source="{Binding Image}" />
             </Border>

             <StackPanel Grid.Column="2">
                <TextBlock Text="{Binding PodcastTitle}" TextWrapping="WrapWholeWords" FontSize="{StaticResource TextStyleExtraLargeFontSize}" />
                <TextBlock Text="{Binding LastUpdated, Converter={StaticResource dateConverter}}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" />
                <TextBlock Text="{Binding PodcastArtist}" TextWrapping="WrapWholeWords" Style="{ThemeResource ListViewItemContentTextBlockStyle}" />
             </StackPanel>
           </Grid>
       </DataTemplate>
   </ListView.ItemTemplate>
 </ListView>
24
CoreyRalli

Так что, похоже, это проблема ОС, о чем свидетельствует эта тема на форумах MS: http://social.msdn.Microsoft.com/Forums/en-US/9a363d33-5760-4d38-9c81-84259c4edcbe/listview -jiggles-горизонтально-когда-большой-элемент-о-прокручивать-или-в-в-Windows-Phone-81-Preview? форум = WindowsPhonePreviewSDK & проф = требуется .

Проблема действительно заключается в виртуализации с элементами, которые не имеют фиксированной ширины. Использование звезды в качестве ширины или растяжение горизонтального выравнивания не сработает, поэтому единственное решение, учитывающее ориентацию и разрешение, заключалось в привязке ширины к свойству ActualWidth контейнера ListView:

<Grid x:name="contentRoot" Margin="19,9.5,19,0">
<ListView>
 <ListView.ItemTemplate>
   <DataTemplate>
     <Grid Width={Binding ActualWidth, ElementName=contentRoot} />

   </DataTemplate>

 </ListView.ItemTemplate>
</ListView>
</Grid>
23
CoreyRalli

Первый элемент в списке не отображается, потому что ActiualWidth Grid равен 0 в первую секунду при загрузке страницы. Это решение, которое работает для меня: 

<Grid x:Name="contentRoot" Margin="20">
<ListView>
 <ListView.ItemTemplate>
   <DataTemplate>
     <Grid MinWidth="{Binding ActualWidth, ElementName=contentRoot}" />
   </DataTemplate>
 </ListView.ItemTemplate>
</ListView>
</Grid>
6
Attila Ács

Это действительно раздражающая ошибка. Я не могу понять, почему это не исправлено с годами.

Imho растягивание элементов в режиме вертикальной прокрутки - это очень простая функция, которая должна работать на 100%.

Возможный обходной путь - также это отрубленный, который должен также знать об изменениях размера:

public class StrechItemsListView : ListView
{
    public StrechItemsListView()
    {
        SizeChanged += StrechItemsListView_SizeChanged;
    }

    private void StrechItemsListView_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if (ItemsPanelRoot != null)
        {
            ItemsPanelRoot.Width = e.NewSize.Width;
        }
    }
}

Изменение xaml только на пользовательский тип списка - это менее трудоемкий процесс, чем редактирование каждой таблицы данных и т.д. Только мои 2 цента.

3
Andre Classen

Кажется, моя практика работает. По крайней мере, в WP8.1

Просто установите ItemsPanelTemplate в блоке <ListView></ListView> явно, но не используйте

Style="{StaticResource ListViewStyle1}" или что-то еще. 

Образец кода:

<ListView ItemsSource="{Binding RadioList}" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollMode="Disabled"
            ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollMode="Auto">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Margin="10,3,10,0">
                    <TextBlock Text="{Binding RadioName}" FontSize="15" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Vertical" Width="{Binding PhoneWidth}"/>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
    </ListView>

Параметры HorizontalContentAlignment и Width из VirtualizingStackPanel используются для центрирования содержимого в ListView. Вы можете свободно перемещать эти параметры. Я не знаю почему, но это работает.

2
Silenco Tang

Это было исправлено в Windows 10 для приложений Windows 8.1

0
Alberto Rivelli