从app开始固定

时间:2014-01-05 23:11:43

标签: c# windows-phone-8

我有一个包含项目的LongListSelector。我制作了一个contextMenu,所以当你持有一段时间后,你会得到一个“pin to start”的选项。我没有绑定正确的项目“名称”和平铺图片的问题,但我打开正确的项目(或一般打开)有问题。

这是固定项目的代码:

        private void Pin_click(object sender, RoutedEventArgs e)
    {
        PhoneApplicationService.Current.State["country"] = countriesList.SelectedItem;
        Country selectedCountry = (sender as MenuItem).DataContext as Country;

        string page = "/countryPage.xaml?id=" + countriesList.SelectedItem;

        StandardTileData tileInfo = new StandardTileData
        {
            BackgroundImage = new Uri(selectedCountry.Flag, UriKind.Relative),
            Title = selectedCountry.Name
        };
        ShellTile.Create(new Uri(page, UriKind.Relative), tileInfo);
    }

问题出在countryPage上,因为没有数据上下文,应用程序崩溃了:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var k = (app.MainPage.Country)PhoneApplicationService.Current.State["country"];
    DataContext = k;
}

2 个答案:

答案 0 :(得分:0)

基于您的代码的2条建议:

您的LongListSelector的itemSource是Country对象的集合吗?因为在第二页上,您尝试将状态数据类型转换为国家/地区对象。这可能是个问题。

其次,尝试使用IsolatedStorage而不是Phone State,因为State是瞬态数据,因为没有保证永远存在。

答案 1 :(得分:0)

据推测,您有一个Country对象列表,用于填充ItemsSource countriesList的{​​{1}}。你为什么不保持在 App.xaml.cs 类公共定义的列表,并确保当应用程序使用它开始填充LongListSelector

Application_Launching()

public static List<Country> Countries { get; set; } 个对象中,使用类似Country的内容定义某种唯一标识符属性。

Guid

在创建Guid m_CountryID; public Guid CountryID { get { return m_CountryID; } set { m_CountryID = value; } } 对象

时填充它
Country

Country.CountryID = new Guid() 方法中,将QueryString id参数从上方设置为Pin_click

CountryID

然后,在的string page = "/countryPage.xaml?id=" + selectedCountry.CountryID.ToString(); 方法您的 countryPage.xaml.cs OnNavigatedTo从查询字符串的id参数来检索给定的Guid对象

Country

现在您已经选择了protected override void OnNavigatedTo(NavigationEventArgs e) { string countryID = string.Empty; NavigationContext.QueryString.TryGetValue("id", out countryID); System.Diagnostics.Debug.WriteLine(string.Concat("URI: ", e.Uri.ToString(), " | CountryID: ", countryID)); if (!string.IsNullOrWhiteSpace(countryID)) { Guid countryGuid = new Guid(); Guid.TryParse(countryID, out countryGuid); Country country = App.Countries.Where(x => x.CountryID == countryGuid).Select(x => x).FirstOrDefault(); if (country != null) { // ***** BUILD YOUR PAGE AS NEEDED HERE ***** // TextBlock1.Text = country.Name; } } } 对象,只需使用其中的信息构建您认为合适的页面。

当然,所有这些都假定您在应用程序会话之间维护您的国家/地区列表的状态。通常,您只需将列表写入隔离存储中的XML文件即可。 GeekChamp有很多文章可以帮助您启动和运行隔离存储。 http://www.geekchamp.com/tips/all-about-wp7-isolated-storage---read-and-save-xml-files

虽然,你可以这样做,而不必担心孤立的存储。只需使用固定Country值(Guid)时,创建您的not new Guid()列表中的Country对象,或者选择一个整数类型,始终确保相同的整数值与关联每次应用程序启动时重建它时每个Countries