下面通过一个示例程序来说明基于ExpressPlugin的开发流程,该示例程序是一个类似于Windows记事本的文本编辑工具,提供了文本文件的创建、编辑、保存等功能,名字就叫SimpleEditor吧。
1.在Visual Studio中新建一个WindowsApplication类型的项目,命名为SimpleEditor。
2.为新建的项目添加引用ExpressPlugin.dll。从VS环境中的添加引用窗口中选择浏览,然后找到安装目录下的bin文件夹,将此文件夹中的dll文件添加到工程引用中。
3.创建文本编辑窗口。在此示例中,简单采用Windows提供的RichTextBox控件作为编辑控件,它具有文本的输入和显示功能。由于在插件框架中,任何工作窗口都是属于视图,需要实现IViewContent接口,才能被框架所识别,所以编辑窗口编辑窗口类也要实现IViewContent。类的定义如下:
/// <summary>
/// 文本编辑窗口
/// </summary>
class TextViewContent : AbstractViewContent
{
//文本编辑控件
private RichTextBox richTextBox = new RichTextBox();
/// <summary>
/// 视图控件属性(实现IViewContent)
/// </summary>
public override Control ViewContentControl
{
get { return richTextBox; }
}
/// <summary>
/// 默认构造函数(创建新文本文件)
/// </summary>
public TextViewContent()
: base()
{
}
/// <summary>
/// 打开已经存在的文件
/// </summary>
/// <param name="fileName">文件路径</param>
public TextViewContent(string fileName)
: base(fileName)
{
this.FileName = fileName;
this.Title = Path.GetFileName(fileName);
if (File.Exists(fileName))
{
StreamReader sr = new StreamReader(fileName, Encoding.Default);
string fileContent = sr.ReadToEnd();
sr.Close();
this.richTextBox.Text = fileContent;
}
}
}
为了将来实现文件的保存和另存功能,需要在该类中增加两个处理函数:
代码
/// <summary>
/// 保存文件
/// </summary>
public void SaveFile()
{
//已经打开的文件
if (File.Exists(this.FileName))
{
this.richTextBox.SaveFile(this.FileName, RichTextBoxStreamType.PlainText);
}
else
{
//新建文件
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.AddExtension = true;
saveDialog.Filter = "文本文件(*.txt,*.log,*.cs) | *.txt; *.log; *.cs";
DialogResult dr = saveDialog.ShowDialog();
if (dr == DialogResult.OK)
{
string fileName = saveDialog.FileName;
this.FileName = fileName;
this.Title = Path.GetFileName(fileName);
this.richTextBox.SaveFile(fileName, RichTextBoxStreamType.PlainText);
this.OnSaved(new SaveEventArgs(true));
}
}
}
/// <summary>
/// 另存文件
/// </summary>
public void SaveAs()
{
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.AddExtension = true;
saveDialog.Filter = "文本文件(*.txt,*.log,*.cs) | *.txt; *.log; *.cs";
DialogResult dr = saveDialog.ShowDialog();
if (dr == DialogResult.OK)
{
string fileName = saveDialog.FileName;
this.FileName = fileName;
this.Title = Path.GetFileName(fileName);
this.richTextBox.SaveFile(fileName, RichTextBoxStreamType.PlainText);
}
}
4.实现功能。有了文本编辑窗口,现在就可以实现具体的文本操作功能。通常的文本操作有新建、打开、保存、另存等功能。每个功能的实现对应一个类,并要实现IMenuCommand接口,IMenuCommand接口定义了菜单的状态控制和调用入口。示例代码如下:
代码
[CommandUsage("新建文件")]
class doNewFile : AbstractMenuCommand
{
public override void Run()
{
//创建文本编辑视图
TextViewContent view = new TextViewContent();
//显示视图
WorkbenchSingleton.Workbench.ShowView(view);
}
}
[CommandUsage("保存文件")]
class doSaveFile : AbstractMenuCommand
{
//控制菜单的可用状态
public override bool IsEnabled
{
get
{
//只有当前的文本编辑窗口不为空时,才能激活保存按钮
return WorkbenchSingleton.Workbench.ActiveViewContent != null;
}
}
public override void Run()
{
IViewContent activeView = WorkbenchSingleton.Workbench.ActiveViewContent;
if (activeView != null && activeView is TextViewContent)
{
TextViewContent textView = activeView as TextViewContent;
//弹出保存路径选择框并保存文本内容
textView.SaveFile();
}
}
}
5.配置系统菜单和界面。编写完功能代码之后,需要指定各个功能的调用入口--菜单,菜单也是应用程序的展现。所以接下来还需要通过工具来配置菜单和应用程序界面,配置的信息有如下几类(与插件类型相对应):
A:应用程序名称等描述信息。
B:运行库。运行库是插件功能代码编译后的成果(dll或exe),此处的设置必须确保文件名称路径等正确,否则应用程序无法运行。
C:启动项。设置系统启动之后自动执行的功能,通常为登录或加载资源等这一类初始化的操作。
D:系统面板。面板是应用程序界面的主要组成部分,必须设置的是面板所对应的实现类,名称、图标和快捷键等为可选。
E:主菜单、右键菜单和工具栏。主菜单和右键菜单的名称为可选,而工具栏按钮必须设定图标,否则无法显示。
6.增加启动界面。 如果需要启动界面,可以把图片保存为SplashScreen.jpg或者SplashScreen.gif,放置在启动目录下即可。
7.启动应用程序。经过以上几个步骤,应用程序原型已经出来了,启动起来看看,然后再做进一步的开发和完善。