这几天给自己做了一个信息助理,提示自己的工作按排。
以前没有接触过XML,所以这次决定正好试验以下。
这个信息助理和FoxMail的邮件信息提示很像,用过FoxMail的人就知道了。本来要发截图但是新的Blog好像不太正常。
这个程序整个都是用XML做数据保存和配置文件。昨天早上突发奇想,为何不用XML配置文件来标示外部扩展程序路径,然后在主程序载入时根据XML文件中插件配置信息动态生成菜单,点击菜单后根据插件路径来执行外部插件呢?于是我就开始动手做了。
插件的XML配置文件格式如下
<?xml version="1.0" encoding="utf-8" ?>
<PlusIns>
<PlusIn>
<Name>界面设置</Name>
<Path>PlusIn/SkinSetting.exe</Path>
</PlusIn>
<PlusIn>
<Name>消息管理</Name>
<Path>PlusIn/MsgManager.exe</Path>
</PlusIn>
<PlusIn>
<Name>定时提醒</Name>
<Path>PlusIn/Timer.exe</Path>
</PlusIn>
<PlusIn>
<Name>插件编辑器</Name>
<Path>PlusIn/PlusEdit.exe</Path>
</PlusIn>
</PlusIns>
菜单就根据配置文件中的Name来显示,执行的时候就根据Path指定的路径执行。
菜单的动态生成很简单,就是Add菜单的MenuItem。每读到一个插件信息就创建一个新的MenItem并将Cleck事件指向同一个事件执行代码。代码如下:
private void LoadPlusIn()
{
XMLHelper helper = new XMLHelper();
XmlDocument doc = new XmlDocument();
doc.Load("plusin.xml");
//读取插件配置
string[] plusins = helper.SearchAnnal(doc,"PlusIn");
if(plusins != null)
{
this.MI_PlusIn.MenuItems.Clear();
//添加菜单
for(int i=0; i<plusins.Length; i+=2)
{
MenuItem newItem = new MenuItem(plusins[i]);
newItem.Click += new EventHandler(newItem_Click);
this.MI_PlusIn.MenuItems.Add(newItem);
}
}
}
然后在这个公共的事件执行代码里将Object类型的sender强制转换为MenuItem类型然后获取它的text属性,再根据这个属性找到XML中对应的插件Path,使用Process.Start方法执行Path所指向的可执行文件。这样插件就被运行了。菜单的点击事件代码如下:
private void newItem_Click(object sender, EventArgs e)
{
XMLHelper helper = new XMLHelper();
XmlDocument doc = new XmlDocument();
doc.Load("plusin.xml");
//查找插件的路径
string[] plusin = helper.SearchAnnal(doc,"PlusIn[Name=" + "'" + ((MenuItem)sender).Text + "']");
try
{
//执行插件
Process.Start(plusin[1]);
}
catch(Exception ex)
{
MessageBox.Show("运行外部插件失败:" + ex.Message);
}
}
注意:
上面的XMLHelper是我自己为了方便封装好的一个XML助手类,节省了一些繁琐操作。大家应用自己的XML操作代码替换之。
使用Process需要引用System.Diagnostics命名空间。