栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > 其他 > xml语言

一个简单的基于XML的模块集成框架

xml语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一个简单的基于XML的模块集成框架

1. 准备一个xml文件

xmlmenu

 1 2     3         4             5             6             7        8

2.准备一个xml schemal文件来验证xml文件

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

3。定义一个类来加载菜单

public class MenuLoad    {        PRivate PluginCollection m_plugins = null;        public MenuBar _menbar = new MenuBar();        public ToolStrip _toolbar = new ToolStrip();        private OutlookBar bar = new OutlookBar();        private ImageList imglist = new ImageList();        private StringBuilder builder = new StringBuilder();        public MenuLoad()        {            bar = _menbar.outlookBar;        }        private TabControl tabCtrl;        public TabControl TabCtrl        {            set            {                tabCtrl = value;            }        }        private void ValidationEventHandler(object sender, ValidationEventArgs e)        {            builder.AppendLine("验证XML文档的时候发生错误:");            builder.AppendLine("严重级别:" + e.Severity);            builder.AppendLine("错误信息:" + e.Message);            builder.AppendLine("------+--------+-------+------+--------+-------+------+--------+-------+");            builder.AppendLine();        }        ///         /// 验证XML文件是否是合乎规范的文件        ///         /// 文件名称        /// 是则返回true,否则返回false        private bool ValidateXml(string xmlfile)        {            bool validXml = false;            string spath = "";            spath = application.StartupPath + "\configurations\xMLSMenu.xsd";            if(!System.IO.File.Exists(spath))            {                throw new System.IO.FileNotFoundException(String.Format(Resources.StringFileNotFound, spath));            }            XmlReaderSettings settings = new XmlReaderSettings();            XmlSchemaSet schemaSet = new XmlSchemaSet();            schemaSet.Add(null, spath);            settings.Schemas.Add(schemaSet);            settings.ValidationType = ValidationType.Schema;            settings.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler);            settings.ValidationFlags = settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;            XmlReader reader = XmlReader.Create(xmlfile, settings);            while(reader.Read())            {            }                        if(builder.Length > 0)            {                validXml = false;            }            else            {                validXml = true;            }            reader.Close();            return validXml;        }        ///         /// 加载菜单        ///         /// 主菜单        /// 菜单定义文件        public MainMenu LoadMenus(string xmlfile)        {            MainMenu mainmenu = new MainMenu();                        try            {                using(new WaitCursor())                {                    //验证XML是否是合乎规范的XML文件                    if(ValidateXml(xmlfile))                    {                        Xmldocument document = new Xmldocument();                        document.Load(xmlfile);                        XmlNode rootNode = document.documentElement;                        mainmenu = GetMenus(rootNode);                       }                    else                    {                        throw new Exception(builder.ToString());                    }                }            }            catch (System.IO.FileNotFoundException)            {                Utility.ShowErrorMsg(String.Format(Resources.StringFileNotFound, xmlfile));            }            return mainmenu;        }        ///         /// 加载菜单        ///         /// 主菜单        /// 菜单项节点        private MainMenu GetMenus(XmlNode node)        {            MainMenu mainmenu = new MainMenu();            List nodelist= new List();            List mnulist = new List();            List iplist = new List();            string menutext ="";            //首先加载主菜单,避免迭代的时候菜单显示的过分延迟。            foreach(XmlNode child in node.ChildNodes)            {                if(child.NodeType == XmlNodeType.Element && child.Name == "MenuItem")                {                    menutext = child.Attributes["Name"].Value;                    OfficeMenuItem item = new OfficeMenuItem(true,menutext);                    mainmenu.MenuItems.Add(item);                    IconPanel cp = new IconPanel();                    bar.AddBand(menutext, cp);                    nodelist.Add(child);                    mnulist.Add(item);                    iplist.Add(cp);                }            }            //加载所有的子菜单            GetSubMenus(iplist.ToArray(),mnulist.ToArray(), nodelist.ToArray());            return mainmenu;        }        ///         /// 加载所有子菜单        ///         /// 主菜单集合        /// 菜单节点集合        private void GetSubMenus(IconPanel[] iplist ,OfficeMenuItem[] main, XmlNode[] node)        {            EventHandler handler = new EventHandler(OnPluginClick);            EventHandler handler1 = new EventHandler(OnIconClick);            EventHandler handler2 = new EventHandler(OnButtonClick);            string asmname;            string formtag;            string text;            MenuClass mc;            XmlNode child;            string iconpath = "";            string iconname = "";            string msc = "";            for(int i = 0; i <= main.GetUpperBound(0); i++)            {                //foreach(XmlNode child in node[i].ChildNodes)                for(int j = 0; j < node[i].ChildNodes.Count;j++ )                {                    child = node[i].ChildNodes[j];                    if(child.NodeType == XmlNodeType.Element && child.Name == "MenuItem")                    {                        asmname = child.Attributes["AssemblyName"].Value;                        formtag = child.Attributes["FormTag"].Value;                        text = child.Attributes["Name"].Value;                        msc = child.Attributes["ShortCut"].Value;                        OfficeMenuItem item = new OfficeMenuItem(true, text, handler);                        iconname = child.Attributes["Image"].Value;                        if(iconname != string.Empty)                        {                            iconpath = Themes.GetCurrentThemePath() +iconname;                            item.IconPath = iconpath;                                                    }                         mc = new MenuClass();                        mc.Assemblyname = asmname;                        mc.FormTag = formtag;                        item.Tag = mc;                        if(msc != string.Empty)                        {                            item.Shortcut = MenuShortCut.GetShortCut(msc);                        }                        main[i].MenuItems.Add(item);                        if((iconpath != string.Empty) && System.IO.File.Exists(iconpath))                        {    //添加按钮到OutlookBar                                                    PanelIcon picon = iplist[i].AddIcon(item.Text,Image.FromFile(iconpath),handler1);                            picon.Tag = mc;                            //添加按钮到toolbar                            ToolStripButton button = new ToolStripButton(item.Text, Image.FromFile(iconpath), handler2);                            button.DisplayStyle = ToolStripItemDisplayStyle.Image;                            button.ToolTipText = item.Text;                            button.Tag = mc;                            button.Visible = true;                            _toolbar.Items.Add(button);                        }                        iconpath = "";                        mc = null;                        if(child.ChildNodes.Count > 0)                        {                            GetChildMenu(iplist[i],item, child);                        }                    }                }                //添加分割线                ToolStripSeparator ss = new ToolStripSeparator();                _toolbar.Items.Add(ss);            }        }        ///         /// 加载子菜单        ///         /// 父菜单        /// 父菜单定义XML节点        private void GetChildMenu(IconPanel ip,OfficeMenuItem parent, XmlNode node)        {            EventHandler handler = new EventHandler(OnPluginClick);            EventHandler handler1 = new EventHandler(OnIconClick);            EventHandler handler2 = new EventHandler(OnButtonClick);            MenuClass mc;            string asmname;            string formtag;            string text;            XmlNode child1;            string iconpath = "";            string iconname = "";            string msc = "";            //foreach(XmlNode child1 in node.ChildNodes)            for(int i = 0; i < node.ChildNodes.Count - 1;i++ )            {                child1 = node.ChildNodes[i];                //检查是否提供了类型                asmname = child1.Attributes["AssemblyName"].Value;                formtag = child1.Attributes["FormTag"].Value;                text = child1.Attributes["Name"].Value;                OfficeMenuItem childitem;                childitem = new OfficeMenuItem(true, text, handler);                childitem.Name = text;                mc = new MenuClass();                mc.Assemblyname = asmname;                mc.FormTag = formtag;                                childitem.Tag = mc;                //添加快捷键                msc = child1.Attributes["ShortCut"].Value;                if(msc != string.Empty)                {                    childitem.Shortcut = MenuShortCut.GetShortCut(msc);                }                //添加图标                iconname = child1.Attributes["Image"].Value;                if(iconname != string.Empty)                {                    iconpath = Themes.GetCurrentThemePath() + iconname;                    childitem.IconPath = iconpath;                }                parent.MenuItems.Add(childitem);                if((iconpath != string.Empty) && System.IO.File.Exists(iconpath))                {    //添加按钮到OutlookBar                                            PanelIcon picon = ip.AddIcon(childitem.Text, Image.FromFile(iconpath), handler1);                    picon.Tag = mc;                    //添加按钮到toolbar                    ToolStripButton button = new ToolStripButton(childitem.Text, Image.FromFile(iconpath), handler2);                    button.DisplayStyle = ToolStripItemDisplayStyle.Image;                    button.ToolTipText = childitem.Text;                    button.Tag = mc;                    button.Visible = true;                    _toolbar.Items.Add(button);                }                iconpath = "";                mc = null;                if(child1.ChildNodes.Count > 0)                {                    GetChildMenu(ip,childitem, child1);                }            }        }        ///         /// 打开一个窗体        ///         /// 窗体类程序集和窗体类的组合,从节点的AssemblyName属性获取        private  void OpenForm(MenuClass mc)        {            string asmname = mc.Assemblyname;            string formtag = mc.FormTag;            if (formtag == "")            {                throw new Exception(Resources.StringNoFormFlag);            }            if(formtag.ToUpper() == "TRUE")            {                if(asmname == string.Empty)                {                    throw new NullReferenceException(Resources.StringAssemblyNull);                }                //string[] a = asmname.Split(',');                object obj = null;                Type tp = Type.GetType(asmname);                if(tp != null)                {                    obj = Activator.CreateInstance(tp);                }                else                {                    throw new Exception("加载程序的时候出错,请检查程序(dll,exe)是否存在或者类型是否正确。");                }                //检查是否是Form类                if((obj == null) | !(obj is Form))                {                    throw new Exception(Resources.StringNotForm);                }                Form frm = (obj as Form);                //检查打开的第一个窗口是否是MDIFORM                if(Application.OpenForms[0].IsMdiContainer)                {                    //作为MDICHILDFORM                    frm.MdiParent = Application.OpenForms[0];                }                //加载窗体                frm.Show();            }        }        ///         /// 菜单单击事件        ///         ///         ///         private void onPluginClick(object sender, EventArgs args)        {            OfficeMenuItem item = (OfficeMenuItem)sender;            MenuClass mc = (MenuClass) item.Tag;            if ((item.Text == "退出") | (item.Text == "EXIT"))            {                onExitClick(sender, args);                return;            }            OpenForm(mc);        }    }

这里面用到了delegate,最重要的函数是加载菜单的函数和OnPluginClick函数。

使用这个框架可以动态增加任意的层次的模块。

微软的CAB 使用Resigster site方式来增加模块,感觉不是很方便。

以上就是一个简单的基于XML的模块集成框架的内容,更多相关内容请关注PHP中文网(www.kaotop.com)!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/794729.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号