【问题标题】:Empty LongListSelector has infinite length空 LongListSelector 的长度是无限的
【发布时间】:2013-11-13 20:01:00
【问题描述】:

我有一个LongListSelector,它位于StackPanel 中。当这个 LLS 为空时,它的长度是无限的,并且它底部的元素是看不到的。

<StackPanel Orientation="Vertical">
    <phone:LongListSelector>
    </phone:LongListSelector>
</StackPanel>

但是当我将它设置为ItemsSource 时,它会变得很好。我尝试将它的 VerticalAlignment 分配到顶部,但没有解决问题 如何让它的尺寸不填表格?

【问题讨论】:

  • StackPanel 的用途是什么?这就是所有相关的xaml吗?另外我假设你的意思是VerticalAlignment="Top",因为HorizontalAlignment to top 预计不会工作。 :P
  • 它包含 LLS 顶部和底部的更多元素。谢谢你的注意,我修好了。
  • 如果你可以避免的话,我不会和MeasureOverride 混淆,这似乎往往会导致问题。我面前没有要测试的 WP 项目,但尝试将其嵌入Grid 并将您的VerticalAlignment 应用到它,作为其子元素,LLS 应该尊重面板的测量。
  • 感谢@ChrisW。使用Grid 而不是StackPanel 现在意味着全新的设计。现在它起作用了,以后我会避免把它放进去!
  • 不,您将保留您的 SP 并将 LLS 单独嵌入其中,其他任何内容都没有更改,但看起来您已经找到了解决方案,这就是最重要的。干杯

标签: xaml windows-phone-7 windows-phone-8 windows-phone longlistselector


【解决方案1】:

(我已经编辑了这篇文章以使其更好)

首先让我们描述一下您遇到的问题,为此我们将使用:

问题:LongListSelector (LLS) 的无限长度 - 老实说,这不是问题,它的工作方式应该如此。因为 LLS 可以有很多很多项目,并且可以很长,就像它的名字一样。问题是您在 StackPanel 中使用它而不修复它的高度。

解决方案

  1. 第一个很简单 - 只需设置 LLS 的高度。您将确定应该低于 LLS 的内容将在那里。就像@Chris W 提到的那样 - 在 StackPanel 中使用 LLS 并不是最有利的,并且可能会导致很多问题 - 所以要避免它。

    <StackPanel Orientation="Vertical">
        <phone:LongListSelector Height="300"/>
        <TextBlock Text="Something/>
    </StackPanel>
    
  2. 最优雅和最好的解决方案(也是@Chris W 建议的) - 将您的 LLS 放入 Grid。这种方式有很多优点,并且使用 Rowdefinitions,您的程序将独立于电话分辨率 - 您的所有控件都将存在,如果它们应该存在的话。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="8*"/>
            <RowDefinition Height="2*"/>
        </Grid.RowDefinitions>
        <phone:LongListSelector Width="100" Grid.Row="0"/>
        <TextBlock Text="Something" Grid.Row="1"/>
    </Grid>
    
  3. 第三种解决方案不如以前的广告那么好,但显示了管理控件的其他方式。您可以覆盖 LLS 的测量方式。但是使用这种方法,您必须注意例如:它可以解决问题,除非您添加的项目太多以至于您的控件将被推离屏幕。此外,您还必须注意必须定义的 this.Width。这么多额外的条件你要检查,当然你可以添加更多的修改,它会工作,但正如我所说,它不如以前的解决方案。

    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);
          }
       }
    }
    

在您的 xaml 中,您必须添加:

<phone:PhoneApplicationPage
 // something before
 xmlns:common="clr-namespace:Extensions"
 // other things
 >

<StackPanel Orientation="Vertical">
    <common:LongListSelectorEx Width="200"/>
    <TextBlock Text="Something/>
</StackPanel>

【讨论】:

  • 谢谢@Romasz。有错误说:MeasureOverride of element 'Phoney.Extensions.LongListSelectorEx' should not return PositiveInfinity or NaN as its DesiredSize.
  • 是的 - 问题是没有定义宽度我像上面一样尝试过(已编辑)。如果您不想定义宽度,请修改 if 语句中的返回值(而不是将 this.width 设置为 0)。告诉我它是否有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多