[英]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.