简体   繁体   English

在WP8的枢纽项目中添加大数据时,UI挂起

[英]UI hangs when adding large data in pivot item for WP8

I am creating a dynamic pivot. 我正在创建一个动态枢纽。 In which I have binded a collection to pivot ItemSouce. 在其中绑定了一个集合,以透视ItemSouce。 When the selectionchange event is fired I am calling a process which takes some time and the update the ObservableCollection which in turn update the UI. 触发selectionchange事件时,我正在调用一个过程,该过程花费一些时间并更新ObservableCollection,从而更新UI。 I am using async and await but still the application UI hangs. 我正在使用异步并等待,但是应用程序UI仍然挂起。 Let me know what is the issue. 让我知道是什么问题。 Looking for a very quick reply. 寻找一个非常快速的答复。

CODE: 码:

 private void CraetePivotItems()
        {
            for (int count = 0; count < 100; count++)
            {
                EntityDetail item = new EntityDetail();
                item.HeaderTitle = "Header " + count;
                item.Name = string.Empty;

                this.Detaildata.Add(item);
            }
        }

        private async Task<string> CreateUserControlForPivotItem(int selectedIndex)
        {
            for (int count = 0; count < 1000000000; count++)
            {
            }

            switch (selectedIndex)
            {
                case 0:
                    return "Item 1";
                case 1:
                    return "Item 2";
                case 2:
                    return "Item 3";
                default:
                    return "Item N";
            }
        }

        private void pvtItmCities_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
            CraetePivotItems();

            this.pvtItmCities.ItemsSource = this.Detaildata;
        }

        private async void pvtItmCities_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (sender != null)
            {

                ////// Create the user control for the selected pivot item
                string pivotItemContentControl = await CreateUserControlForPivotItem(((Pivot)sender).SelectedIndex);

                (this.Detaildata[((Pivot)sender).SelectedIndex] as EntityDetail).Name = pivotItemContentControl;

                //((System.Windows.Controls.ContentControl)((sender as Pivot).SelectedItem)).Content = pivotItemContentControl;
            }
        }

Class

internal class EntityDetail : INotifyPropertyChanged
    {
        private string headerTitle = String.Empty;
        public string HeaderTitle
        {
            get
            {
                return this.headerTitle;
            }

            set
            {
                if (value != this.headerTitle)
                {
                    this.headerTitle = value;
                    NotifyPropertyChanged();
                }
            }
        }

        private string name = String.Empty;
        public string Name
        {
            get
            {
                return this.name;
            }

            set
            {
                if (value != this.name)
                {
                    this.name = value;
                    NotifyPropertyChanged();
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        // This method is called by the Set accessor of each property. 
        // The CallerMemberName attribute that is applied to the optional propertyName 
        // parameter causes the property name of the caller to be substituted as an argument. 
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

XAML: XAML:

<phone:PhoneApplicationPage.Resources>
        <DataTemplate x:Key="HeaderTemplateSample">
            <TextBlock Text="{Binding HeaderTitle}" Foreground="White"/>
        </DataTemplate>

        <DataTemplate x:Key="ItemTemplateSample">
            <local:PivotItem1Content  Foreground="White"/>
        </DataTemplate>
    </phone:PhoneApplicationPage.Resources>

<phone:Pivot x:Name="pvtItmCities" 

                     HeaderTemplate="{StaticResource HeaderTemplateSample}"
                     ItemTemplate="{StaticResource ItemTemplateSample}"
                     SelectionChanged="pvtItmCities_SelectionChanged" Loaded="pvtItmCities_Loaded" Title="pivot demo" LoadingPivotItem="OnLoadingPivotItem">

        </phone:Pivot>

What is the issue?? 有什么问题??

i suggest that you create manually a separate thread and assign it to the function and it will update the UI thread when its finish. 我建议您手动创建一个单独的线程并将其分配给该函数,它会在完成时更新UI线程。 using Async Await doesn't mean that this is going to be on a different thread. 使用Async Await并不意味着这将在另一个线程上。

http://msdn.microsoft.com/en-us/library/windowsphone/develop/cc221403%28v=vs.105%29.aspx http://msdn.microsoft.com/zh-CN/library/windowsphone/develop/cc221403%28v=vs.105%29.aspx

this link show you how to assign a background worker (thread) to complete your tasks 该链接向您展示如何分配后台工作人员(线程)以完成任务

i hope this will help you 我希望这能帮到您

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM