在Windows phone 8 c#中导航后丢失的列表项

本文关键字:列表 导航 phone Windows | 更新日期: 2023-09-27 18:08:17

在我的windows phone应用程序中,我有一个包含所有联系人的列表,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using GetContacts.Resources;
using Microsoft.Phone.UserData;
using Microsoft.Phone.Tasks;
using Windows.Phone.PersonalInformation;
using System.IO.IsolatedStorage;
namespace GetContacts
{
    public partial class MainPage : PhoneApplicationPage
    {
        List<CustomContact> listOfContact = new List<CustomContact>();
        public MainPage()
        {
            InitializeComponent();
            // Sample code to localize the ApplicationBar
            //BuildLocalizedApplicationBar();
        }
    private void ButtonContacts_Click(object sender, RoutedEventArgs e)
    {
        Contacts cons = new Contacts();
        cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(Contacts_SearchCompleted);
        cons.SearchAsync(String.Empty, FilterKind.None, "Contacts Test #1");
    }
    void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
    {
        listOfContact.Clear();
        try
        {
            foreach (var c in e.Results)
            {
                CustomContact contact = new CustomContact();
                contact.Name = c.DisplayName;
                int count = c.PhoneNumbers.Count();
                for (int i = 0; i < count; i++)
                {
                    if (count > 0 && c.PhoneNumbers.ElementAt(i).PhoneNumber != null && !string.IsNullOrEmpty(c.PhoneNumbers.ElementAt(i).PhoneNumber) )
                    {
                        contact.Number[i]= c.PhoneNumbers.ElementAt(i).PhoneNumber.ToString();//.ToString();
                    }
                    else
                    {
                        contact.Number[i] = "";
                    }
                }
                listOfContact.Add(contact);
            }
            for (int i = 0; i < listOfContact.Count(); i++)
            {
                if(listOfContact1.Count != listOfContact.Count)
                {
                    listOfContact1.Add(listOfContact.ElementAt(i));
                }
            }
                ContactResultsData.ItemsSource = listOfContact;

        }
        catch (System.Exception)
        {
            //No results
        }
        if (ContactResultsData.Items.Any())
        {
            ContactResultsLabel.Text = "results";
        }
        else
        {
            ContactResultsLabel.Text = "no results";
        }
    }
        private void hyplnk_Next_Click(object sender, RoutedEventArgs e)
        {
            PhoneApplicationService.Current.State["Contact"] = listOfContact;
            NavigationService.Navigate(new Uri("/createGroups.xaml?Contact=" + listOfContact, UriKind.Relative));
        }
    }
}

下面是CustomContact类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using GetContacts.Resources;
using Microsoft.Phone.UserData;
using System.IO;
using System.Xml.Serialization;
namespace GetContacts
{
    public class  CustomContact
    {
        public string[] number = new string[5];
        public string Name { get; set; }
        public string[] Number
        {
            get { return number; }
            set { number = value; }
        }
        public CustomContact()
        {
        }
        public CustomContact( Contact contact)
        {
            Name = contact.DisplayName;
            int count = contact.PhoneNumbers.Count();
            for (int i = 0; i < count; i++)
            {
                if (count > 0 && contact.PhoneNumbers.ElementAt(i).PhoneNumber != null && !string.IsNullOrEmpty(contact.PhoneNumbers.ElementAt(i).PhoneNumber))
                {
                    Number[i] = contact.PhoneNumbers.ElementAt(i).PhoneNumber.ToString();
                }
                else
                {
                   Number[i] = "";
                }
            }
        }
    }
}

下面是XAML页面

<Grid x:Name="ContentPanel" Margin="12,0,12,0">
      <StackPanel Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,10">
        <TextBlock x:Name="ContactResultsLabel" Text="results are loading..." Style="{StaticResource PhoneTextLargeStyle}" TextWrapping="Wrap" />
        <ListBox x:Name="ContactResultsData" ItemsSource="{Binding listOfContacts}" Height="293" Margin="24,0,0,0" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock x:Name="ContactResultsName" Text="{Binding Name}" FontSize="50" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</Grid>
<Grid Grid.Row="1">
    <Button x:Name="ButtonContacts"
            Content="Get All Contacts"
            FontSize="15"
            Width="200"
            Height="70"
            Background="AliceBlue"
            Foreground="Blue"
            HorizontalAlignment="Left"
            Click="ButtonContacts_Click" Margin="27,30,0,322"></Button>
</Grid>

hyplnk_Next_Click事件中,我将列表导航到下一页,但是当我回到上一页时,列表的项丢失了,列表为空。我应该做些什么来维护导航后的元素列表。请给我推荐一下。等待您的回复。谢谢。

在Windows phone 8 c#中导航后丢失的列表项

您已经保存了transientState (customcontents列表),尽管您的hyperlinkbutton处理程序不是保存它的地方。我猜你在导航回联系人页面后没有加载它。

你应该阅读并理解应用程序执行模型。这对Windows Phone的开发至关重要。

保存和加载页面状态的地方是页面的重写方法OnNavigatedFrom OnNavigatedTo。

这里有一个例子

protected override void OnNavigatedTo(NavigationEventArgs e)
{    
    base.OnNavigatedTo(e);
    if (PhoneApplicationService.Current.State.Contains["Contact"])
    {
        listOfContact = 
            PhoneApplicationService.Current.State["Contact"] as List<CustomContact>();
    }
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    base.OnNavigatedFrom(e);
    PhoneApplicationService.Current.State["Contact"] = listOfContact;
}

OnNavigatedFrom在你导航离开页面时被调用,而OnNavigatedTo在你导航到页面时被调用。