在微软官方提供的资源中,我们可以看到SampleDataSource.cs已经拥有了定义好了相应的数据结构以及实现类:
建立本地数据
由于我们已经有数据以及相应的数据类,我们需要做的仅仅是将数据放进数据类中,并在数据源的构造函数中调用它:
首先定义一个方法,用来绑定本地数据:
1 public SampleDataSource() 2 { 3 // Loca local data 4 GetLocalFiles(); 5 }
为了使界面运行起来不影响效果,需要通过添加async关键字来进行操作。
其余解析均用注释的方式表示在代码中:
1 public async Task GetLocalFiles() 2 { 3 string folderIndex = "Index_"; // Foler filter 4 var Path = @"Data"; //Binding Folder 5 6 var Folders = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(Path).GetResults().GetFoldersAsync(); 7 8 //对于每个folder分别取出 9 foreach (var folder in Folders) 10 { 11 var group = new SampleDataGroup(folder.Name, folder.Name, "", "", ""); 12 var files = await folder.GetFilesAsync(); 13 14 //对每个文件也需要分别取出 15 foreach (var file in files) 16 { 17 //判断文件类型是否为文本形式 18 if (!file.FileType.Equals(TXTFILEEXTENSION)) 19 { 20 string filename = file.Name.Split(new char[] { '.' })[0]; 21 22 //判断文件名是否包括_index 23 if (filename.Contains(folderIndex)) 24 { 25 group.SetImage("/" + Path + "/" + folder.Name + "/" + file.Name); 26 } 27 else 28 { 29 var pictureItem = new SampleDataItem(filename, filename, "", 30 "/" + Path + "/" + folder.Name + "/" + file.Name, "", "", group); 31 group.Items.Add(pictureItem); 32 } 33 } 34 } 35 36 //文本情况的操作 37 foreach (var file in files) 38 { 39 if (file.FileType.Equals(TXTFILEEXTENSION)) 40 { 41 string filename = file.Name.Split(new char[] { '.' })[0]; 42 if (filename.Contains("Index_")) 43 { 44 group.Description = await Windows.Storage.FileIO.ReadTextAsync(file); 45 } 46 else 47 { 48 var item = group.Items.First<SampleDataItem>(i => i.Title.Split(new char[] { '.' })[0] == filename); 49 item.Description = item.Content = await Windows.Storage.FileIO.ReadTextAsync(file); 50 } 51 } 52 } 53 //最后把所有数据绑定到AllGroups中 54 _sampleDataSource.AllGroups.Add(group); 55 } 56 }
建立SKYDRIVE数据
首先,在SKYDRIVE中存入同名的文件,并在本地进行reference。同时需要注意的是:我们需要在网上下载一个LIVE SDK,具体操作如下:
然后写代码读取数据,并在构造函数中调用InitAuth()方法(请先将GetLocalFiles()注释掉)
微软官网给出的代码修改如下:
1 #region GetRemote Files 2 private async void InitAuth() 3 { 4 if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled) 5 { 6 LiveAuthClient authClient = new LiveAuthClient(); 7 LiveLoginResult authResult = await authClient.LoginAsync(new List<string>() { "wl.signin", "wl.skydrive" }); 8 if (authResult.Status == LiveConnectSessionStatus.Connected) 9 { 10 App.Session = authResult.Session; 11 } 12 // Forece to logout then login 13 authClient.Logout(); 14 authResult = await authClient.LoginAsync(new List<string>() { "wl.signin", "wl.skydrive" }); 15 LoadProfile(); 16 } 17 } 18 19 private async void LoadProfile() 20 { 21 // We may use this code later, but comment them here. 22 //LiveConnectClient client = new LiveConnectClient(App.Session); 23 //LiveOperationResult liveOpResult = await client.GetAsync("me"); 24 //dynamic dynResult = liveOpResult.Result; 25 //App.UserName = dynResult.name; 26 LoadData(); 27 } 28 29 public async void LoadData() 30 { 31 LiveConnectClient client = new LiveConnectClient(App.Session); 32 33 LiveOperationResult albumOperationResult = await client.GetAsync("me/albums"); 34 dynamic albumResult = albumOperationResult.Result; 35 foreach (dynamic album in albumResult.data) 36 { 37 if (album.name == "TravelJourney") 38 { 39 LiveOperationResult travelJourneyOperationResult = await client.GetAsync(album.id + "/files"); 40 dynamic travelJourneyResult = travelJourneyOperationResult.Result; 41 foreach (dynamic subalbum in travelJourneyResult.data) 42 { 43 var group = new SampleDataGroup(subalbum.id, subalbum.name, "", @"ms-appx:///Assets/DarkGray.png", subalbum.description); 44 LiveOperationResult pictureOperationResult = await client.GetAsync(subalbum.id + "/files"); 45 dynamic pictureResult = pictureOperationResult.Result; 46 47 foreach (dynamic picture in pictureResult.data) 48 { 49 if (!picture.name.EndsWith(".txt")) 50 { 51 if (picture.name.Contains("Index_")) 52 { 53 group.SetImage(picture.source); 54 } 55 else 56 { 57 var pictureItem = new SampleDataItem(picture.id, picture.name, "", picture.source, picture.description, picture.description, group); 58 group.Items.Add(pictureItem); 59 } 60 } 61 } 62 63 foreach (dynamic picture in pictureResult.data) 64 { 65 if (picture.name.EndsWith(".txt")) 66 { 67 68 string filename = picture.name.Split(new char[] { '.' })[0]; 69 StorageFile file = await DownLoadTxtFile(picture.id, picture.name); 70 string description = await Windows.Storage.FileIO.ReadTextAsync(file); 71 if (filename.Contains("Index_")) 72 { 73 group.Description = description; 74 } 75 else 76 { 77 var item = group.Items.First<SampleDataItem>(i => i.Title.Split(new char[] { '.' })[0] == filename); 78 item.Description = item.Content = description; 79 } 80 } 81 } 82 this.AllGroups.Add(group); 83 } 84 } 85 } 86 } 87 88 /// <summary> 89 /// Simply check whether file exists. 90 /// </summary> 91 /// <param name="fileName"></param> 92 /// <returns></returns> 93 async Task<bool> DoesFileExistAsync(string fileName) 94 { 95 try 96 { 97 await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync(fileName); 98 return true; 99 } 100 catch 101 { 102 return false; 103 } 104 } 105 106 /// <summary> 107 /// Download file if description file does not exist. 108 /// </summary> 109 /// <param name="fileid"></param> 110 /// <param name="filename"></param> 111 /// <returns></returns> 112 private async Task<StorageFile> DownLoadTxtFile(string fileid, string filename) 113 { 114 var fileExists = await DoesFileExistAsync(filename); 115 if (fileExists) 116 { 117 return await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync(filename); 118 } 119 else 120 { 121 StorageFile file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(filename); 122 LiveConnectClient client = new LiveConnectClient(App.Session); 123 await client.BackgroundDownloadAsync(fileid + "/content", file); 124 return file; 125 } 126 } 127 #endregion
本文部分内容BITED了解的也不是很深入。待进一步了解再给出更详细的经验解说。
Copyright ©2013 BITED.All rights reserved.