空的LongListSelector导致无限的ScrollViewer

本文关键字:ScrollViewer 无限 LongListSelector 空的 | 更新日期: 2023-09-27 17:49:53

情况如下:

我有一个数据源,它通过某些属性(我们称之为Checked)过滤到视图模型上的两个列表中。叫它新旧。

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

哦,他们需要一起滚动。因此,如果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。现在这一切都工作得很好,而这两个列表都有一些东西。

但是,当其中一个没有任何内容时,它会立即扩展以填充其父元素的整个高度。在这种情况下……无限滚动查看器。这意味着如果新列表中没有任何内容,那么屏幕上就绝对没有任何可见内容,如果新列表中没有任何内容…我几乎可以无限滚动后,通过新建列表项。

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

任何想法?

空的LongListSelector导致无限的ScrollViewer

将两个列表控件置于彼此之下通常是一个坏主意,因为scrollviewer在scrolviewer中。

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

你所面临的问题是,默认情况下,当空LLS被测量它的高度,你看到的是'无限'。您正在使用StacPanel,这意味着第二个LLS处于无限LLS之下。

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

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

如果可以的话,使用带有已定义行的Grid而不是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中有许多项目时,你的控件可能会被推离屏幕。
你也可以在这里阅读