千家信息网

基于XML模块集成框架的示例分析

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,这篇文章将为大家详细讲解有关基于XML模块集成框架的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 准备一个xml文件xmlmenu 1 2 3
千家信息网最后更新 2024年09月22日基于XML模块集成框架的示例分析

这篇文章将为大家详细讲解有关基于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模块集成框架的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0