在使用 UWP 进行探索时,我遇到了这个我正在尝试的简单应用的问题。 我的应用程序在Windows Phone中自动关闭512mb ram,因为内容太多而且我想这会让手机内存不足。
我想问一下在不使应用崩溃的情况下加载内容的正确方法是什么? 我应该在屏幕的末尾实现更多的负载并加载一些内容并在点击时隐藏另一个内容,还是有其他更好的解决方案?
我已经阅读了一些关于UI虚拟化的内容,但在这种情况下我不知道如何实现它。一个例子就是appriciated。
<ScrollViewer HorizontalScrollBarVisibility="Hidden" Height="500" Loaded="Populate">
<StackPanel x:Name="ContentsPanel"></StackPanel>
</ScrollViewer>
void Populate(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 1000; i++)
{
ContentsPanel.Children.Add(new TextBlock
{
Text = @"ipsumSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
totam rem aperiam,
eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.Neque porro quisquam est,
qui dolorem ipsum quia dolor sit amet,
consectetur,
adipisci velit,
sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.Ut enim ad minima veniam,
quis nostrum exercitationem ullam corporis suscipit laboriosam,
nisi ut aliquid ex ea commodi consequatur ? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
vel illum qui dolorem eum fugiat quo voluptas nulla pariatur ?
At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
});
}
}
答案 0 :(得分:3)
大多数情况下,当你的内存耗尽时,因为你已经加载了大量图像,或者你没有使用/已经破坏了虚拟化。这是一个过于简单的规则,但是,您不应该将堆栈面板放在滚动查看器中。如果您发现自己想要这样做,那么您可能想要的实际上是一个ListView绑定到某种ItemsSource(:=
如果您希望以后能够添加/删除内容,或任何library(data.table)#v1.9.5+
nm1 <- colnames(df)[3:5]
setDT(df)[, paste0("NEW_", nm1) :=shift(.SD, type='lead') ,
by = FILIAL_CODE, .SDcols = nm1]
df
# FILIAL_CODE UNIDADES MES_ZOO PRODUCTOSUNICOS DEVOLUCIONES NEW_MES_ZOO
#1: 10 26394 Jan 2010 3592 39 Feb 2010
#2: 10 24314 Feb 2010 3337 22 Mar 2010
#3: 10 26280 Mar 2010 3459 12 Apr 2010
#4: 10 25056 Apr 2010 3256 24 May 2010
#5: 10 28827 May 2010 3355 26 Jun 2010
#6: 10 24781 Jun 2010 3196 31 <NA>
# NEW_PRODUCTOSUNICOS NEW_DEVOLUCIONES
#1: 3337 22
#2: 3459 12
#3: 3256 24
#4: 3355 26
#5: 3196 31
#6: NA NA
如果它是完全静态的。如果列表视图的内容是同类的,你可以使用ListView.ItemTemplate,如果内容是异构的,你可以使用ListView.ItemTemplateSelector为不同类型的项目选择不同的模板。
当您使用ListView时,XAML运行时只会为屏幕上当前显示的内容创建足够的UI控件+在顶部和底部稍微一点,以确保滚动顺畅。请注意,这是UI虚拟化,而不是内容虚拟化,因为您可以在绑定为ItemSource的类上实现ISupportIncrementalLoading。
编辑以添加请求的样本:
ObservableCollection<T>
答案 1 :(得分:1)
您可以在滚动查看器结束后加载更多内容。 How to find that ScrollViewer is scrolled to the end in WPF?提供了一个示例。