因為最近要做的項目中,我要通過XML動態生成窗體,看了UI圖樣,我有些叫苦:我通過XML動態生成窗體,可是主窗體中UI要用圖標來確定要使用的窗體,怎麼才能使主窗體的圖標也是動態加載而且圖標和要生成的窗體還有關聯呢?我又想到用XML,查MSDN,看到只有XmlTextWriter和XmlTextReader裡分別有XmlTextWriter.WriteBase64和XmlTextReader.ReaDBase64可以操作圖片這種二進制字節的數據。但是XmlTextWriter和XmlTextReader遠不如XmlDocument操作方便,如果用這兩者我就得寫太多的代碼。困擾了我一天,記得以前看到過一篇文章介紹怎樣將圖片數據存儲到Xml文件,可是怎麼也找不到,後來終於在一個英文網站上找到了相關內容,而且還是2003年貼出來的,汗。好了,不廢話了,我把我的實現代碼貼給大家吧。private XmlDocument document;private string FilePath = Application.StartupPath + "\\..\\..\\FormStyle.xml"; // FormStyle.xml 文件地址 private void frmMain_Load(object sender, System.EventArgs e){ if(document == null) { document = new XmlDocument(); document.Load(FilePath); } // 只挑選含有Form的節點 XmlNodeList FormNodes = document.GetElementsByTagName("Form"); lbIcons.BeginUpdate(); lbIcons.Items.Clear(); foreach(XmlNode node in FormNodes) { // 把節點的名稱放到下拉列表裡 lbIcons.Items.Add(node.Attributes["Name"].Value); } lbIcons.EndUpdate();} private void lbIcons_SelectedValueChanged(object sender, System.EventArgs e){ // 查找下拉框所選的窗體下是否有Image元素,若無則退出 XmlNode node = document.DocumentElement.SelectSingleNode(string.Format("descendant::Form[@Name='{0}']/Image", lbIcons.SelectedItem.ToString())); if(node == null) return; // 如果含有Image元素,就將元素值轉換為Base64String,然後放到內存流 using (MemoryStream mem = new MemoryStream(Convert.FromBase64String(node.InnerText))) { // 加載內存流數據為位圖 Bitmap bmp = Bitmap.FromStream(mem) as Bitmap; pictureBox1.Image = bmp; }} private void btnAdd_Click(object sender, System.EventArgs e){ // 如果不存在txtFilePath.Text所指文件,就退出 if(!File.Exists(txtFilePath.Text) || lbIcons.Items.Count == 0) return; if(lbIcons.SelectedIndex == -1) lbIcons.SelectedIndex = 0; if(document == null) { document = new XmlDocument(); document.Load(FilePath); } //Read the bitmap. string data = null; Bitmap bmp = new Bitmap(txtFilePath.Text); using (MemoryStream mem = new MemoryStream()) { bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Bmp); // 將位圖數據轉換為Base64String放入字符串中 data = Convert.ToBase64String(mem.ToArray()); } // 查找當前所選的窗體是否含有Image節點,若就新建一個 XmlNode node = document.DocumentElement.SelectSingleNode(string.Format("descendant::Form[@Name='{0}']", lbIcons.SelectedItem.ToString())); XmlNode ImageNode = document.DocumentElement.SelectSingleNode(string.Format("descendant::Form[@Name='{0}']/Image", lbIcons.SelectedItem.ToString())); if(ImageNode == null) { ImageNode = document.CreateElement("Image"); node.AppendChild(ImageNode); } // 將位圖數據保存到XML文檔 ImageNode.InnerText = data; document.Save(FilePath);}