繁体   English   中英

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

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

我正在创建一个动态枢纽。 在其中绑定了一个集合,以透视ItemSouce。 触发selectionchange事件时,我正在调用一个过程,该过程花费一些时间并更新ObservableCollection,从而更新UI。 我正在使用异步并等待,但是应用程序UI仍然挂起。 让我知道是什么问题。 寻找一个非常快速的答复。

码:

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

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:

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

有什么问题??

我建议您手动创建一个单独的线程并将其分配给该函数,它会在完成时更新UI线程。 使用Async Await并不意味着这将在另一个线程上。

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

该链接向您展示如何分配后台工作人员(线程)以完成任务

我希望这能帮到您

暂无
暂无

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

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