空LongListSelector导致无限的ScrollViewer

时间:2012-12-30 13:38:23

标签: c# .net xaml windows-phone-8

情况就是这样:

我有一个数据源被某个属性(我们称之为Checked)过滤到viewmodel上的两个列表中。称之为新旧。

新的一个需要显示在一个列表中,旧的一个需要显示在它下面的列表中。

哦,他们需要齐声滚动。因此,如果Old目前处于屏幕之外,那么当列表被刷新时,它将会进入可见性状态。

我目前用LongListSelectors解决了这个问题:

<ScrollViewer  VerticalAlignment="Top" VerticalScrollBarVisibility="Auto">
    <StackPanel>
        <phone:LongListSelector x:Name="NewList" Margin="0,0,0,0" ItemsSource="{Binding New}"  SelectionChanged="NewList_SelectionChanged">
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,0,17">
                        <TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" Foreground="{Binding Color}" />
                    </StackPanel>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
        <phone:LongListSelector x:Name="OldList" Margin="0,0,0,0" ItemsSource="{Binding Path=Old}" Padding="0,20,0,0">
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,0,17">
                        <TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" FontStyle="Italic" Foreground="{Binding Color}"/>
                    </StackPanel>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
    </StackPanel>
</ScrollViewer>

滚动查看器内的stackpanel内的两个longlistselectors。现在它完全可以工作,而这两个列表都有。

然而,当其中一个没有任何内容时,它会立即扩展以填充其父级的整个高度。在这种情况下......无限滚动查看器。这意味着如果新列表中没有任何内容,屏幕上将无法显示任何内容,如果新列表中没有任何内容......我可以在通过新列表项后无限滚动。

我有什么选择吗?没有以编程方式创建大量的文本字段,然后尝试将事件附加到它,或者更糟糕的是,编写我自己的列表控件?标准列表框不起作用,因为它们都是单独滚动的。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

由于ScrolViewers中的ScrollViewers,彼此之间有两个列表控件是一个坏主意。

我建议你使用一个没有任何ScrollViewer的LongListSelector。 然后用旧的新项创建一个集合,并使用ItemTemplateSelector以不同的方式设置它们。

答案 1 :(得分:0)

您面临的问题是,默认情况下,当测量emty LLS时,它的高度就像您看到的那样是“无限”。您正在使用StacPanel,这意味着第二个LLS处于无限LLS之下。

简单的解决方案是设置LLS的高度:

<phone:LongListSelector x:Name="NewList" Height="300" Margin="0,0,0,0" ItemsSource="{Binding New}"  SelectionChanged="NewList_SelectionChanged">

如果可以 - 使用具有已定义行而不是StacPanel的网格。如果您仍想使用StackPanel,则可以覆盖LLS中的方法MeasureOverride()并进行扩展 如果你这样做,它应该工作:

namespace Extensions
{
   public class LongListSelectorEx : LongListSelector
   {
      protected override System.Windows.Size MeasureOverride(System.Windows.Size availableSize)
      {
         if (this.ItemsSource == null)
            return new System.Windows.Size(this.Width, 0);
         if (this.ItemsSource.Count <= 0)
            return new System.Windows.Size(this.Width, 0);

         return base.MeasureOverride(availableSize);
      }
   }
}

如果你没有定义宽度,也要注意(返回值不能是NaN - 在那种情况下将0改为this.Width)。当然,你还需要检查LLS的高度,如果你没有你的控件可以在屏幕上推出,当LLS中有很多项目时。 您还可以阅读有关此here

的信息