Проблема прокрутки списка Wp7 в PivotItem - Не удается остановиться на последнем элементе, фиксированная высота не помогает - PullRequest
5 голосов
/ 26 октября 2010

У меня есть простой список с большим количеством элементов, чем помещается на экране. Если вы прокрутите до последнего элемента, он будет показан, но затем снова исчезнет с экрана - я не могу оставить его в поле зрения. После часа поиска в Google это, кажется, известная проблема в ранних версиях Listbox, но это все еще кажется в последних инструментах. Также кажется, что есть проблема с фиксированной высотой и виртуализацией , но установка высоты на уровне элемента или уровне списка не имеет значения. Я вижу, что список в шаблоне приложения WindowsPhoneDataBound работает нормально с прокруткой и без высоты.

Мне также хотелось бы решение без фиксированной высоты, чтобы оно не требовало нового состояния для альбомной ориентации.

Есть предложения, пожалуйста?

Мой список находится в пользовательском контроле, который находится в PivotItem:

        <controls:PivotItem x:Name="pivotItemSetup" Header="setup">
            <local:listBoxBlindsControl Margin="0,0,-12,0"/>
        </controls:PivotItem>

и пользовательский элемент управления:

 <Grid x:Name="LayoutRoot" Background="Transparent">
        <ListBox x:Name="listBoxBlinds" ItemsSource="{Binding BlindSet.Blinds}" SelectionChanged="MainListBox_SelectionChanged" Height="500">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Height="80" Margin="0,0,0,17" Width="103">
                        <StackPanel Orientation="Horizontal"  Visibility="{Binding IsBreak, ConverterParameter=true, Converter={StaticResource boolToVisibility}}" VerticalAlignment="Top" d:LayoutOverrides="Width">
                            <TextBlock Text="{Binding LevelNumber, ConverterParameter='level \{0\} - ', Converter={StaticResource stringTextConverter}}" TextWrapping="NoWrap" Margin="0" Style="{StaticResource PhoneTextExtraLargeStyle}" d:LayoutOverrides="Width"/>
                            <TextBlock Text="{Binding SmallBlind, ConverterParameter=\{0\}/, Converter={StaticResource stringTextConverter}}" TextWrapping="NoWrap" Margin="0" Style="{StaticResource PhoneTextExtraLargeStyle}" d:LayoutOverrides="Width"/>
                            <TextBlock Text="{Binding BigBlind}" TextWrapping="NoWrap" Margin="0" Style="{StaticResource PhoneTextExtraLargeStyle}" d:LayoutOverrides="Width"/>
                        </StackPanel>
                        <TextBlock x:Name="txtbreak" Text="break" TextWrapping="NoWrap" Margin="0,0,0,23" Style="{StaticResource PhoneTextExtraLargeStyle}" d:LayoutOverrides="Width, Height" Visibility="{Binding IsBreak, ConverterParameter=false, Converter={StaticResource boolToVisibility}}" Foreground="{StaticResource PhoneAccentBrush}" />
                        <StackPanel Orientation="Horizontal" Margin="0,0,0,23" VerticalAlignment="Bottom" d:LayoutOverrides="Width">
                            <TextBlock Text="{Binding MinutesPerBlind, ConverterParameter=\{0\} minutes, Converter={StaticResource stringTextConverter}}" TextWrapping="NoWrap" Margin="0" Style="{StaticResource PhoneTextSubtleStyle}" d:LayoutOverrides="Width"/>
                            <TextBlock Text="{Binding Ante, ConverterParameter=\, \{0\} ante, Converter={StaticResource stringTextConverter}}" TextWrapping="NoWrap" Margin="0" Style="{StaticResource PhoneTextSubtleStyle}" d:LayoutOverrides="Width" Visibility="{Binding Ante, ConverterParameter=0, Converter={StaticResource valueToVisibility}}"/>
                        </StackPanel>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

Еще немного информации: я скопировал и вставил точный XAML из WindowsPhoneDataBoundApp (который работает) в мой usercontrol, чтобы он теперь выглядел так:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <ListBox x:Name="listBoxBlinds" Margin="0,0,-12,0" ItemsSource="{Binding BlindSet.Blinds}" SelectionChanged="MainListBox_SelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Margin="0,0,0,17" Width="432">
                    <TextBlock Text="{Binding LevelNumber}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                    <TextBlock Text="{Binding SmallBlind}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

и это не работает ... так это как-то связано с PivotItem? Обновление: Я вынул этот код из PivotItem, и он работает нормально. Итак, есть идеи, как заставить его работать в сводном элементе?

Ответы [ 4 ]

2 голосов
/ 25 июля 2011

Мне нужна была именно эта вещь, и в итоге я просто связал ВЫСОТУ списка со значением ACTUALHEIGHT панели стека, в которой он находится.

Таким образом, у вас может быть

<controls:PivotItem Header="Destinations" Margin="0,0,12,0" Name="pvtItemDestinations">
    <StackPanel Name="stkDestinations">
        <ListBox Name="lstDestinations" 
                 HorizontalContentAlignment="Stretch" 
                 Height="{Binding ElementName=stkDestinations, Path=ActualHeight, Mode=OneWay}">
            <ListBox.ItemTemplate>
                ...
                xaml continues
                ...
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</controls:PivotItem>

Затем выполнитеубедитесь, что панель стека настроена на автоматическое заполнение любого пространства, в котором она находится, и до того, как окно списка изменит размер до размера его контейнера стека, а логика прокрутки будет активирована правильно.

Обратите внимание, что это в основном применяется, когда ваш шаблон элементазаканчивается определением предметов, которые могут варьироваться по высоте.Если они все одного роста, это обычно не проблема.

1 голос
/ 30 ноября 2010

Поместите Grid вокруг вашего списка в PivotItem.Это заставит список в режим прокрутки.

<controls:PivotItem x:Name="pivotItemSetup" Header="setup">
  <Grid>
    <local:listBoxBlindsControl Margin="0,0,-12,0"/>
  </Grid>
</controls:PivotItem>
0 голосов
/ 23 июля 2012

У меня был Scrollviewer вокруг всех данных xaml, и прокрутка для Listbox перестала работать:

<ScrollViewer>
    <Grid>
        <control:Pivot>
            <control:PivotItem>
                <Grid>
                    <Listbox>
                    ...

После того, как я удалил ScrollViewer, прокрутка элементов списка снова заработала.

0 голосов
/ 30 декабря 2011

Я решил это, добавив нижнее поле к ItemsPanel, содержащему элементы:

<ListBox>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Margin="0,0,0,96" />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  <ListBox.ItemTemplate>
    <DataTemplate>
    ...
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>
...