1、前言數據庫
終於完成windows通用應用「51單片機彙編」,半年前開始玩WindowsPhone開發的第一個真正意義上的App(還不少缺點=_=)。開發從1月中旬考完試到今天,期間實習了半個月,玩了幾天,算起來基本弄了3個多星期吧。很少說,總結總結。windows
2、開發數據準備app
應用中主要的數據是單片機的彙編指令,我主要用XML文件來儲存數據,沒有使用SQLLite數據庫,數據格式以下圖:async
xml文件的數據是我手輸入的,因此這是比較煩的。(可能有更簡潔的辦法獲取數據)。ide
而xml文件每一個每一個節點對應實例,如Code字節下的實例C#代碼以下:工具
public Code(String uniqueId, String title, String subtitle, String imagepath, String insertTime, String description, String exmaple, String comment,string collectFlag) { this.UniqueId = uniqueId; this.Title = title; this.Subtitle = subtitle; this.ImagePath = imagepath; this.InsertTime = insertTime; this.Description = description; this.Example = exmaple; this.Comment = comment; this.CollectFlag = collectFlag; } public Code() { // TODO: Complete member initialization } public string UniqueId { get; set; } public string Title { get; set; } public string Subtitle { get; set; } public string ImagePath { get; set; } public string InsertTime { get; set; } public string Description { get; set; } public string Example { get; set; } public string Comment { get; set; } public string CollectFlag { get; set; } public override string ToString() { return this.Title; } }
從xml文件取出數據則利用Linq to Xml,部分C#代碼以下:動畫
public static async Task<Code> GetCodeAsync(string uniqueId) { //await _sampleDataSource.GetSampleDataAsync(); //var matches = _sampleDataSource.Groups.SelectMany(group => group.Items).SelectMany(item=>item.Codes).Where((code)=>code.UniqueId.Equals(uniqueId)); //if (matches.Count() == 1) return matches.First(); //return null; //Uri dataUri = new Uri("ms-appx:///DataModel/SampleData.xml"); //StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(dataUri); StorageFolder localfolder = ApplicationData.Current.LocalFolder; StorageFile XMLfile = await localfolder.CreateFileAsync(FILENAME, CreationCollisionOption.OpenIfExists); string xmlText = await FileIO.ReadTextAsync(XMLfile); XDocument xmlObject; xmlObject = XDocument.Parse(xmlText); var data = (from query in xmlObject.Descendants("Code") where query.Element("UniqueId").Value == uniqueId select new Code((string)query.Element("UniqueId"), (string)query.Element("Title"), (string)query.Element("Subtitle"), (string)query.Element("ImagePath"), (string)query.Element("StoreFlag"), (string)query.Element("Description"), (string)query.Element("Example"), (string)query.Element("Comment"), XmlDataService.CheckHasAttributes(query))).FirstOrDefault(); return data; }
PS:本來在程序中,我是直接從 利用Uri:ms-appx:///DataModel/SampleData.xml獲取xml文件,同時後續操做對文件進行數據的改寫,這種辦法在WindowsPhone8.1徹底可行,但在Windows8.1中,該文件是隻讀的,不能這樣操做,不然會出現ACCESSDENY錯誤。我只能在程序第一次啓動時,把SampleData.xml文件複製到LocalFolder裏了,而後App之後對數據進行讀寫,都是對複製的文件進行讀寫(相比讀取Installation裏的文件,讀取LocalFolder的文件,Windows應用沒有發現什麼不一樣,但在WinodwsPhone中,讀取數據的操做相對慢點,在個人Lumia620 內存512M,感受比較卡,不知道有什麼辦法解決)。負責文件操做主要是在App.xaml.cs,C#代碼以下:this
public App() { this.InitializeComponent(); if ((string)localsetting.Values["IsHubFirstOpen"] != "true") { localsetting.Values["IsHubFirstOpen"] = "true"; LoadXmlFile(); } this.Suspending += this.OnSuspending; } .... public static async void LoadXmlFile() { string FILENAME = "CodeCopyFile.XML"; StorageFolder localfolder = ApplicationData.Current.LocalFolder; var dataUri = new Uri("ms-appx:///DataModel/SampleData.xml"); StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(dataUri); await file.CopyAsync(localfolder, FILENAME, NameCollisionOption.ReplaceExisting); }
2、對Xml文件數據進行改寫spa
這個App須要對用戶的數據進行存儲,我直接把用戶本身的數據寫到原文件中,好比App:設計
在Windows8.1中:
在WindowsPhone8.1中:
在兩種平臺都須要把用戶本身的筆記保存下來。這裏主要是對xml文件進行改寫,十分簡單,記錄筆記方法C#代碼以下:
public static async Task<bool> WriteComment(string uniqueId, string comment) { StorageFolder localfolder = ApplicationData.Current.LocalFolder; StorageFile XMLfile = await localfolder.CreateFileAsync(FILENAME, CreationCollisionOption.OpenIfExists); using (Stream stream = await XMLfile.OpenStreamForReadAsync()) { XDocument xmlObject = XDocument.Load(stream); foreach (var codeValue in xmlObject.Descendants("Code").ToArray()) { if ((string)codeValue.Element("UniqueId") == uniqueId) { using (Stream newstream = await XMLfile.OpenStreamForWriteAsync())//這裏須要注意,在修改編輯已存在的xml文件時須要設置Length=0,position=0,從新寫。 { DateTime time = DateTime.Now; var insertTime = string.Format("修改時間:{0}年{1}月{2}日 {3}:{4}", time.Year, time.Month, time.Day, time.TimeOfDay.Hours, time.TimeOfDay.Minutes); codeValue.SetElementValue("Comment", comment); codeValue.SetElementValue("StoreFlag", insertTime);//修改時間 newstream.SetLength(0); xmlObject.Save(newstream); // await newstream.FlushAsync(); } return true; } } } return false; }
3、UI
本應用後臺核心代碼基本是對數據進行讀寫,這部分代碼寫好後,我就進行兩個平臺的UI設計了,說實話比較喜歡UI設計,挺好玩的。由於最開始學的就是WindowsPhone,WindowsPhone平臺上的UI設計比較熟悉,比較快弄好,可是弄好後,一些界面在不一樣分辨率的模擬器手機會有點不一樣呈現,還須要以後的修改,比較喜歡本身設計的這個頁面:
感受挺好的。
至於Windows8.1,以前沒有學過開發windowsApp,比較費力,並且該應用在Windows上體驗應該比較差吧,若屏幕縱向,徹底不能看的節奏。在設計在Windows的App的 UI時,不少參考了@MS-UAP http://www.cnblogs.com/ms-uap/ 上面博客園的通用應用設計,好比TopBar基本是用MS-UAP的。
4、後續
後續的話,代碼整理整理。還有設計方面,在應用上小細節加一些WPF動畫,感受挺炫的;應用功能方面,還能夠增長單片機定時器、串口速率等計算工具...弄完了,爽!!最後祝你們羊年快樂,心願成真,身體健康。祝本身在大三下學期找個好實習,大四找個好工做,萬事如意!!!
你們感興趣的能夠,下載看看,初次開發,多多建議!
51單片機彙編 Windows Store 連接 :http://apps.microsoft.com/windows/app/51/b8ffef35-7fa7-45d5-9cd5-f2672bf9a8fe
51單片機彙編 WindowsPhone Store 連接:http://www.windowsphone.com/s?appid=3519c5ac-f013-4663-8eb9-fd536fdd8c8f
51單片機彙編 代碼:http://pan.baidu.com/s/1sjpyXat 密碼:7e6l