WP7 ListBox 滚动不工作

14

我在一个WP7用户控件中有以下的XAML标记。我的问题是当我的ListBox有超过一页显示不下的项目时,无法正常滚动。我可以通过手指向上滑动来滚动列表,但是一旦我松开手指,它就会跳回到列表的顶部(如果列表非常长,则即使在这种有限的范围内也无法正常滚动)。

我尝试了许多不同的布局,但都没有成功,例如将ListBox包装在ScrollViewer中、使用StackPanel替代Grid、删除WrapPanel并将其替换为Grid等。

其他类似的问题建议删除StackPanel(我已经删除了,但没有任何效果)或使用ScrollViewer(但也不起作用)。

托管用户控件的页面使用了GestureListener-我将其删除后仍然没有任何改变。

<Grid x:Name="LayoutRoot"
      Background="SteelBlue">

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <!--<TextBlock Grid.Row="0"
               Text="Search"
               Style="{StaticResource PhoneTextTitle2Style}" />-->

    <Grid Grid.Row="0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <TextBlock Text="Search Type"
                   Grid.Column="0"
                   VerticalAlignment="Center" />

        <RadioButton Content="RMB/RSD"
                     Grid.Column="1"
                     IsChecked="{Binding Path=SearchType, Converter={StaticResource enumBooleanConverter}, ConverterParameter=RMB, Mode=TwoWay}" />

        <RadioButton Content="Name"
                     Grid.Column="2"
                     IsChecked="{Binding Path=SearchType, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Name, Mode=TwoWay}" />
    </Grid>

    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <TextBlock Text="Search Term"
                   Grid.Column="0"
                   VerticalAlignment="Center" />

        <TextBox Grid.Column="1"
                 Text="{Binding SearchTerm, Mode=TwoWay}"
                 InputScope="{Binding SearchTermInputScope}">
            <i:Interaction.Behaviors>
                <b:SelectAllOnFocusBehavior />
            </i:Interaction.Behaviors>
        </TextBox>

    </Grid>

    <Button Grid.Row="2"
            Content="Find"
            cmd:ButtonBaseExtensions.Command="{Binding FindDeliveryPointsCommand}" />

    <ListBox Grid.Row="3"
             ItemsSource="{Binding SearchResults}"
             ScrollViewer.VerticalScrollBarVisibility="Auto">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <toolkit:WrapPanel Orientation="Horizontal"
                                   Width="480"
                                   Background="{Binding RMB, Converter={StaticResource alternateColorConverter}}">
                    <TextBlock Text="{Binding RMB}"
                               FontSize="26"
                               Foreground="Navy"
                               Padding="5"
                               Width="60" />
                    <TextBlock Text="{Binding HouseholdName}"
                               FontSize="26"
                               Foreground="Navy"
                               Padding="5"
                               Width="420" />
                    <TextBlock Text="{Binding StreetWithRRN}"
                               FontSize="26"
                               Foreground="Navy"
                               Padding="5" />
                    <TextBlock Text="{Binding Street.Locality.Name}"
                               FontSize="26"
                               Foreground="Navy"
                               Padding="5" />
                </toolkit:WrapPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

2
你的问题有点复杂。我建议创建一个新页面,其中包含一个ListBox,其中充满了字符串,并验证其是否可以正确滚动。然后慢慢地添加回你上面的代码。当它停止工作时,你就找到了原因!请注意,不需要使用ScrollViewer.VerticalScrollBarVisibility。 - ColinE
2个回答

41

指定ListBox.Height - 类似于Height="200"。目前,ListBox会自动扩展以容纳所有加载的项,并且会超出屏幕范围。结果是页面过大,没有滚动条。

当您添加ListBox.Height时,ListBox区域将不会增长。相反,ListBox ScrollViewer将被激活,您将获得所需的效果。


谢谢你,你的解决方案完美地解决了问题。我想这很明显,但是我错过了它。 - daveywc
但是,如果列表动态更改,并且无法设置高度怎么办? - Vitalii Vasylenko
我选择将height="550"放在这里,这样可以在Windows Phone模拟器的所有屏幕上显示。 - overallduka
虽然这是一个旧的线程,但我现在也遇到了同样的问题。我发现这个解决方案可行,即使是嵌套的绑定列表,但如果高度超过屏幕高度,就会出现问题。如果你的列表框最终比屏幕更长,设置高度为 Height="550" 就可以解决问题。 - James

1

当页面上的其他控件发生变化时,我使用数据绑定来调整ListBox的高度。

<StackPanel x:Name="ContentPanel" Grid.Row="1">            
        <ListBox x:Name="LstSample" Height="{Binding ElementName=ContentPanel, Path=ActualHeight}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Source="{Binding ImagePath}" Stretch="None"/>
                        <StackPanel Orientation="Vertical">
                            <TextBlock Text="{Binding Name}" FontSize="45"/>
                            <TextBlock Text="{Binding Group}" FontSize="25"/>
                        </StackPanel>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接