在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
事件中,我将列表导航到下一页,但是当我回到上一页时,列表的项丢失了,列表为空。我应该做些什么来维护导航后的元素列表。请给我推荐一下。等待您的回复。谢谢。
您已经保存了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在你导航到页面时被调用。