Windows phone正确显示项目集合的方式

时间:2015-08-30 17:10:41

标签: c# xaml windows-runtime windows-phone-8.1 windows-10

我的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

1 个答案:

答案 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