代码部分 using System; using System.Collections.Generic; using System.Text; using System.Xml.Linq; using System.Xml; using System.Linq; using System.IO; using System.Windows.Forms; namespace Future.DataEntry.PocketPC { public class ControlLayoutManagement { private XElement Root; private static ControlLayoutManagement controlLayoutManagement; private ControlLayoutManagement() { initResourceFile(); } //4. LINQ的语义: //from 临时变量 in 集合对象或数据库对象 //where 条件表达式 //[order by条件] //select 临时变量中被查询的值 //[group by 条件] public static ControlLayoutManagement GetInstance() { if (controlLayoutManagement == null) controlLayoutManagement = new ControlLayoutManagement(); return controlLayoutManagement; } /// <summary> /// 取得xml文件 /// </summary> /// <returns></returns> private string GetFilePath() { System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); string s = assembly.ManifestModule.FullyQualifiedName; s = System.IO.Path.GetDirectoryName(s); string path = System.IO.Path.Combine(s, "ControlsLayout.xml"); return path; } /// <summary> /// 读取xml文件 /// </summary> private void initResourceFile() { XmlReader xmlReader = XmlReader.Create(new StringReader(Future.DataEntry.PocketPC.Properties.Resources.ControlsLayout)); Root = XElement.Load(xmlReader); //Root = XElement.Load(GetFilePath()); } /// <summary> /// 取得控件位置 /// </summary> /// <param name="FormName"></param> /// <param name="ControlName"></param> /// <param name="screenLayout"></param> /// <returns></returns> private ControlPosition GetControlsLayoutFormXml(string FormName, string ControlName, ScreenLayout screenLayout) { XName Form = "Form", Name = "name", Control = "Control", Layout = "Layout", direction = "direction", Location = "Location", x = "x", y = "y", Size="Size",width = "width", height = "height"; //string FormName = "FormLogin", ControlName = "panelMain", Direction = "Vertical"; string Direction = screenLayout.ToString(); var LocationList = from ControlLayout in Root.Elements().Elements().Elements(Layout) where ( ControlLayout.Attribute(direction).Value == Direction && ControlLayout.Parent.Attribute(Name).Value == ControlName && ControlLayout.Parent.Parent.Attribute(Name).Value == FormName ) select new { X = (int)ControlLayout.Element(Location).Element(x), Y = (int)ControlLayout.Element(Location).Element(y), Width = (int)ControlLayout.Element(Size).Element(width), Height = (int)ControlLayout.Element(Size).Element(height) }; //select ControlLayout; ControlPosition controlPosition = null; foreach (var item in LocationList) { controlPosition = new ControlPosition(); controlPosition.X = item.X; controlPosition.Y = item.Y; controlPosition.Width = item.Width; controlPosition.Height = item.Height; } return controlPosition; } /// <summary> /// 设置控件的位置 /// </summary> /// <param name="control"></param> /// <param name="controlPosition"></param> private void SetControlPosition(Control control, ControlPosition controlPosition) { if ( controlPosition == null ) return; control.Top = controlPosition.X; control.Left = controlPosition.Y; control.Width = controlPosition.Width; control.Height = controlPosition.Height; } private Form1 form1; public void SetControlsLayoutFormXml(Control control) { Form1 f1 = control as Form1; if(f1 != null) form1 = f1; foreach (Control item in control.Controls) { SetControlPosition(item, GetControlsLayoutFormXml(form1.Name, item.Name, form1.ScreenLayout)); if (item.Controls.Count > 0) SetControlsLayoutFormXml(item); } } } } xml文件部分 <?xml version="1.0" encoding="utf-8" ?> <Root> <!--登录窗口--> <Form name="FormLogin" type="Form"> <!--panel控件--> <Control name ="panelMain" type="Panel"> <!--横--> <Layout direction="Traverse"> <Location> <x>3</x> <y>3</y> </Location> <Size> <width>320</width> <height>188</height> </Size> </Layout> <!--竖--> <Layout direction="Vertical"> <Location> <x>3</x> <y>3</y> </Location> <Size> <width>234</width> <height>262</height> </Size> </Layout> </Control> </Form> </Root>