Windows phone 7 列表框在第一次加载时挂起UI

Windows phone 7 列表框在第一次加载时挂起UI,windows-phone-7,listbox,onedrive,Windows Phone 7,Listbox,Onedrive,在我的代码中,我试图使用skydrive针对WindowsPhone7的API从skydrive获取文件夹。我正在使用列表框获取文件夹。文件夹加载成功,但它挂起用户界面,但当我按下后退按钮,再次打开页面时,它工作正常。 这是我的列表框 <ListBox Grid.Row="1" x:Name="lbFolders" Margin="0" SelectionChanged="lbFolders_SelectionChanged"> <L

在我的代码中,我试图使用skydrive针对WindowsPhone7的API从skydrive获取文件夹。我正在使用列表框获取文件夹。文件夹加载成功,但它挂起用户界面,但当我按下后退按钮,再次打开页面时,它工作正常。 这是我的列表框

<ListBox Grid.Row="1" x:Name="lbFolders"
              Margin="0" SelectionChanged="lbFolders_SelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                    <Border Background="#007ccf" Margin="0,0,15,4">
                        <Image Source="/DataHub;component/images/icon_folder.png" Width="48" Height="48" />
                    </Border>
                    <TextBlock Text="{Binding Name}" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

这是我的函数,名为async,用于获取skydrive数据

    private void GetMetaDataAsyncSkyDriveCompleted(object sender, LiveOperationCompletedEventArgs e)
    {
        progressBar1.IsLoading = false;

        if (!String.IsNullOrEmpty(e.RawResult))
        {

            var metaData = JsonConvert.DeserializeObject<SkyDriveFolderDataContainer>(e.RawResult);

            if (metaData.data.Count > 0)
                metaData.data.ForEach(x => x.Name = x.name);

            if (SkyDriveHashSet == null) SkyDriveHashSet = new Dictionary<string, SkyDriveFolderDataContainer>();

            if (SkyDriveHashSet.ContainsKey(TargetPath))
            {
                SkyDriveHashSet[TargetPath] = metaData;
            }
            else
            {
                SkyDriveHashSet.Add(TargetPath, metaData);
            }

            if (!HasSchemaInIt(metaData.data, TargetPath))
            {
                SkyDriveDisplayData.Clear();
                if (metaData != null && metaData.data != null && metaData.data.Count > 0)
                {
                    var folderList = metaData.data.Where(x => x.type == FileConstants.SkyDriveFolderKeyword && x.shared_with.access == FileConstants.SkyDriveMyFiles).ToList();

                    if (folderList.Any())
                    {
                        folderList.ForEach(x => x.Name = x.name.Length > 15 ? x.name.Substring(0, 12) + "..." : x.name);

                        folderList.ForEach(x => SkyDriveDisplayData.Add(x));
                    }
                }
                CurrentPath.Text = TargetPath;
                SetVisibilityAfterGetMetaData();
            }

            if (App.ViewModel.SkyDriveSelectedFolderDictionary.ContainsKey(TargetPath))
                SkyDriveParentFolderId = App.ViewModel.SkyDriveSelectedFolderDictionary[TargetPath];
        }
        else
        {
            MessageBox.Show(String.Format("SkyDrive replied: {0}", e.Error.Message));
        }
    }
private void GetMetaDataAsyncSkyDriveCompleted(对象发送方,LiveOperationCompletedEventArgs e)
{
progressBar1.IsLoading=false;
如果(!String.IsNullOrEmpty(e.RawResult))
{
var metaData=JsonConvert.DeserializeObject(e.RawResult);
如果(metaData.data.Count>0)
metaData.data.ForEach(x=>x.Name=x.Name);
如果(SkyDriveHashSet==null)SkyDriveHashSet=new Dictionary();
if(SkyDriveHashSet.ContainsKey(TargetPath))
{
SkyDriveHashSet[TargetPath]=元数据;
}
其他的
{
添加(TargetPath,元数据);
}
如果(!HasSchemaInIt(metaData.data,TargetPath))
{
SkyDriveDisplayData.Clear();
如果(元数据!=null&&metaData.data!=null&&metaData.data.Count>0)
{
var folderList=metaData.data.Where(x=>x.type==FileConstants.SkyDriveFolderKeyword&&x.shared_with.access==FileConstants.SkyDriveMyFiles.ToList();
if(folderList.Any())
{
ForEach(x=>x.Name=x.Name.Length>15?x.Name.Substring(0,12)+“…”:x.Name);
ForEach(x=>SkyDriveDisplayData.Add(x));
}
}
CurrentPath.Text=TargetPath;
SetVisibilityAfterGetMetaData();
}
if(App.ViewModel.SkyDriveSelectedFolderDictionary.ContainsKey(TargetPath))
SkyDriveParentFolderId=App.ViewModel.SkyDriveSelectedFolderDictionary[TargetPath];
}
其他的
{
Show(String.Format(“SkyDrive回复:{0}”,e.Error.Message));
}
}

尝试将JsonConvert.DeserializeObject放入TaskEx。运行并等待它

var parsedResult = await TaskEx.Run(() => JsonConvert.DeserializeObject<MyObject>(resultString));
var parsedResult=await TaskEx.Run(()=>JsonConvert.DeserializeObject(resultString));

尝试将JsonConvert.DeserializeObject放入TaskEx。运行并等待它

var parsedResult = await TaskEx.Run(() => JsonConvert.DeserializeObject<MyObject>(resultString));
var parsedResult=await TaskEx.Run(()=>JsonConvert.DeserializeObject(resultString));

我的函数GetMetaDataAsyncSkyDriveCompleted被称为async,那么需要调用反序列化对象async。Windows phone 8中使用了Wait,但我正在Windows phone 7应用程序中使用它。只需安装Bcl,您就可以在wp7上使用async:然后,在反序列化之前添加Wait。在我的例子中,解析包含7-8个字段的30个对象的列表最多需要0.5秒。这是值得注意的ui故障,如果不使用async.still不起作用…请尝试理解以下问题:我的UI仅在首次登录skydrive时挂起,然后它工作正常。我的函数GetMetaDataAsyncSkyDriveCompleted被称为async,那么需要调用反序列化对象async.and Wait在Windows phone 8中使用,但我将其用于Windows phone 7只需安装Bcl,就可以在wp7上使用async:然后,在反序列化之前添加wait。在我的例子中,解析包含7-8个字段的30个对象的列表最多需要0.5秒。如果不使用async,这是一个值得注意的ui故障。仍然不起作用…请尝试理解这个问题,我的ui只有在第一次登录skydrive时才会挂起,之后它就可以正常工作了