在我的应用程序中实现书签/ favouriotes类型函数

时间:2011-03-15 11:56:51

标签: c# .net silverlight windows-phone-7 isolatedstorage

我正在研究如何在我的应用程序中实现书签或优惠类型功能的概念。基本上,这使用户能够从我的应用程序中保存喜欢的页面,然后将其显示在收藏夹列表中。当然也需要删除优惠。 在我的申请中,我可能只需要两到三条信息,如“页面名称”和“页面地址”。

我的思路是孤立存储和创建XML文件,但事实证明这很困难。

编辑:我不是要求代码或任何东西,而是更多关于如何处理这个以及使用哪些方法的想法。

非常感谢。

3 个答案:

答案 0 :(得分:2)

我同意马特的同意。

Overflow7中,我为每个书签使用实际的XAML导航URL - 然后使用单个JSON文件(使用JSON.Net)将书签列表保存在单个中

因此,例如,搜索的书签实际上存储在一个大对象中,如:

"windows-phone-7" : {
   "Bookmark" : "/Views/SearchPage.xaml?Site=StackOverflow&Tag=windows-phone-7"
},
"Stuart" : {
   "Bookmark" : "/Views/UserPage.xaml?Site=StackOverflow&User=12341"
},

这使得书签导航机制非常简单 - 但这确实意味着我以后很难更改我的页面名称。为了将来进行校对,最好将页面名称从持久化书签

中分离出来

为了实际制作/清除书签我在ApplicationBar上使用了一个图标 - 但唯一的问题是你不能使用颜色来显示开/关状态 - 因为ApplicationBar在轻主题模式下的工作方式你必须使用一些不同的图标形状来显示书签是否打开/关闭。

加载和保存书签正在使用:

    private const string BookmarkFileName = "Bookmarks.json";

    private void LoadBookmarks()
    {
        BookmarkViewModel = new AppBookmarkViewModel();
        try
        {
            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (false == store.FileExists(BookmarkFileName))
                {
                    return;
                }

                using (var fs = store.OpenFile(BookmarkFileName, System.IO.FileMode.Open))
                {
                    using (var sr = new StreamReader(fs))
                    {
                        var text = sr.ReadToEnd();
                        BookmarkViewModel = JsonConvert.DeserializeObject<AppBookmarkViewModel>(text);
                    }
                }
            }
        }
        catch (Exception exc)
        {
            BookmarkViewModel = new AppBookmarkViewModel();
            MessageBox.Show("Sorry - there was a problem reading bookmarks - " + exc.Message);
        }
    }

    public void SaveBookmarks()
    {
        try
        {
            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (store.FileExists(BookmarkFileName))
                {
                    store.DeleteFile(BookmarkFileName);
                }

                using (var fs = store.OpenFile(BookmarkFileName, System.IO.FileMode.CreateNew))
                {
                    using (var sw = new StreamWriter(fs))
                    {
                        var text = JsonConvert.SerializeObject(BookmarkViewModel);
                        sw.Write(text);
                    }
                }
            }
        }
        catch (Exception exc)
        {
            // don't show message box during shutdown
            //MessageBox.Show("Sorry - there was a problem reading bookmarks - " + exc.Message);
        }
    }

答案 1 :(得分:1)

这将取决于用户实际上喜欢什么,但这里是我如何处理这个问题的快速概述。 (这就像我在实际项目中做过类似的事情一样。)

如果你有一个字典/列表(或类似的集合/可枚举的)你的页面,我只有一个单独的集合存储了喜欢的页面的索引。

要保留收藏夹我只是序列化集合(我使用json而不是xml来获取速度)并将其保存到IsolatedStorage中的文件中。

添加和删除收藏夹woudl就是更新集合的情况。

要显示收藏夹,我将创建一个包装键/索引列表的类,并查看完整的页面列表,以查看其名称是什么以及在选择时导航到的位置。

答案 2 :(得分:0)

你可以在隔离存储之上使用一些数据库之王,例如Sterling DB。然后,您可以使用LINQ查询/删除收藏夹。

希望这有帮助