【问题标题】:Empty LongListSelector causes infinite ScrollViewer空 LongListSelector 导致无限的 ScrollViewer
【发布时间】:2012-12-30 13:38:22
【问题描述】:

情况是这样的:

我有一个数据源,它被某些属性(我们称之为 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>

滚动查看器内的堆栈面板内的两个长列表选择器。现在,这一切都非常有效,而这两个列表中都有一些东西。

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

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

有什么想法吗?

【问题讨论】:

  • 手机没有 MaxHeight 属性吗?我知道有时它对于 WPF 来说有点蹩脚的解决方案,但它确实有效!
  • 有。问题是,我要么向下滚动太远,要么扩展不够。
  • 我也有类似的问题。您能否尝试删除您明确定义的 Scrollviewer 并使用 ItemSelector 的默认滚动。

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


【解决方案1】:

将两个列表控件放在一起通常是个坏主意,因为 ScrollViewers 位于 ScrollViewers 中。

我建议您使用单个 LongListSelector 而不使用任何 ScrollViewer。 然后用旧的和新的项目创建一个集合,并使用 ItemTemplateSelector 为它们设置不同的样式。

【讨论】:

    【解决方案2】:

    您面临的问题是,默认情况下,当测量 emty 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 中有很多项目时,您的控件可能会被推离屏幕。
    你也可以阅读这个here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多