我的XML文件包含我的项目,我将它们反序列化为ObservableCollection<UserControl>
,我希望用我自己的布局将其放到ItemsControl
。
现在我已经创建了自己的UserControl来处理反序列化的数据到布局,而ObservableCollection被绑定到我的ItemsControl但是如果我想显示超过5-10个项目我的应用程序如果一段时间没有响应。
我怎样才能避免冻结?我应该在ItemsControl中使用DataTemplate还是其他任何想法?我想知道它在twitter或reddit这样的应用程序中是如何完成的,它们有很多条目,而且一切都很好。已经搜索过reddit / twitter应用程序来源,看看他们是如何实现它的,但没有成功。
修改
XAML
<ScrollViewer>
<ItemsControl x:Name="items" ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
C#
public MainPage()
{
this.InitializeComponent();
items.DataContext = _items;
}
public ObservableCollection<my_item> _items = new ObservableCollection<my_item>();
添加项目
for (int i = 0; i < 40; i++)
{
_items.Add(new my_item());
}
my_item
是我自己的UserControl,包含2个小图片,几个按钮和一个TextBlock
。
答案 0 :(得分:0)
默认情况下,您应该使用具有虚拟化面板的ListView
来显示项目:
<ListView ItemsSource={Binding Items} >
<ListView.ItemTemplate>
<DataTemplate>
<!-- here goes your item layout -->
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
如果您在UI线程上反序列化/解析XML文件,可能是您的应用程序“挂起”的一个原因,特别是如果XML文件很大,那么这个问题的解决方案就是您需要进行XML解析在后台主题:
Task.Run(() =>
{
var items = ParseXML();
});
修改后:
<强> 1)强>
不要将ItemsControl
包裹在ScrollViewer
内,因为您将破坏虚拟化。 ItemsControl
本身有自己的ScrollViewer
,因此不需要额外的Windows Phone 8.1 Runtime
。
如果您在ItemsStackPanel
,请使用VirtualizingStackPanel
代替DataTemplates
。
<强> 2)强>
对于包含许多项目的列表,建议使用<DataTemplate>
<MyUserControl/>
</DataTemplate>
而不是使用UI元素填充它。因此,请从用户控件创建数据模板:
IMEI