基于xml动态界面设计: 
利用xml文件定义好系统界面所需要的所有控件细节,如主菜单,工具条等等 然后通过读取该xml文件的形式生成系统界面,用c# 或vb.net语言的,哪位能给出一个简单的源代码例子,在下感谢万分! 
理论知识看了好多,就是不能在实践中实现,请给出代码例子!谢谢!

解决方案 »

  1.   

    a)首先,从MenuItem派生一个DataMenuItem(即包含数据的菜单之意),因为Xml源文件里可能有很多数据需要保存,而MenuItem没有保存数据的地方
    public class DataMenuItem:MenuItem
    {
     public string[] AttributeNames,AttributeValues;//保存该菜单的源Xml节点中的所有属性名称和值
     public string Value;//该节点的值(值这种说法可能不太准确,应该是InnerText)
     public string GetAttributeValueByName(string AttributeName)//为以后的程序取得属性值留的一个方法
     {
      if(AttributeNames==null||AttributeValues==null)return "";
      if(AttributeNames.Length!=AttributeValues.Length)return "";
      int i;
      for(i=0;i<AttributeNames.Length;i++)
      {
       if(AttributeNames[i]==AttributeName)return AttributeValues[i];
      }
      return "";
     }
    }b)然后是一个把Xml数据添加到菜单的方法,详细说明见注释
    private void XmlToMenu(XmlNode Node,MenuItem Menu)
    {
     int i;
     DataMenuItem TempMenuItem=new DataMenuItem();
     TempMenuItem.Index=Menu.MenuItems.Count;//应该可以省略的.
     TempMenuItem.Text=Node.Name;
     TempMenuItem.Value=Node.InnerText;
     if(Node.Attributes.Count>0)//如果有属性,就保存了.没有属性就跳过
     {
      TempMenuItem.AttributeNames=new string[Node.Attributes.Count];
      TempMenuItem.AttributeValues=new string[Node.Attributes.Count];
      for(i=0;i<Node.Attributes.Count;i++)
      {
       TempMenuItem.AttributeNames[i]=Node.Attributes[i].Name;
       TempMenuItem.AttributeValues[i]=Node.Attributes[i].Value;
      }
     }
     TempMenuItem.Click+= new System.EventHandler(this.DataMenu_Click);//添加处理Click事件的方法,由于DataMenuItem是带有数据的,所以这个处理方法可以根据数据的不同来做不同的处理.
     Menu.MenuItems.Add(TempMenuItem);
     if(Node.ChildNodes.Count>1)//因为即使没有子节点,Node.ChildNodes.Count也会是1
     {
      foreach(XmlNode Nodes in Node.ChildNodes)
      {
       XmlToMenu(Nodes,Menu.MenuItems[Menu.MenuItems.Count-1]);//递归调用自身
      }
     }
    }c)处理Click事件的方法:
    private void DataMenu_Click(object sender, System.EventArgs e)
    {
     DataMenuItem Clicked=(DataMenuItem)sender;
     MessageBox.Show(Clicked.Value);//这个只是测试一下,实际中可以根据情况的不同随意取用DataMenuItem里的数据;
    }
    d)最后,只需要调用上面的方法就可以了。提供如下代码供参考,其中有些地方为了看起来更易懂,多花了一些步骤;Menu_Xml.MenuItems.Clear();//Menu_Xml可自行修改;
    int i;
    XmlDocument xmldoc = new XmlDocument();
    XmlTextReader reader=new XmlTextReader("Ini.xml");
    xmldoc.Load(reader);
    XmlNodeList NodeList=xmldoc.DocumentElement.ChildNodes;
    for(i=0;i<NodeList.Count;i++)
    {
     XmlNode Node=NodeList[i];
     XmlToMenu(Node,Menu_Xml);
    }
    reader.Close();  例子Xml:Ini.xml
    <?xml version="1.0" encoding="GB2312" ?>
    <TEST>
    <test1>1</test1>
    <test2>2</test2>
    <test3>3</test3>
    <test4>4</test4>
    <List>
     <test1>1</test1>
     <test2>2</test2>
     <test3>3</test3>
     <List1>
      <test1>1</test1>
      <test2>2</test2>
     </List1>
    </List>
    </TEST>