上一篇Blog向大家介绍了智能标签。如前所说,开发智能标签程序并非很“舒适”,尤其是在部署上,因为我们必须将COM组件注册到计算机上,然后将其ClsID加到位于注册表的智能标签列表处。而如果使用SmarterTag(注意这个名词和SmartTag的区别),这个托管包装器来开发智能标签程序,那就爽多了。
首先,在 这里下载SmarterTag,除了SmarterTag之外,还有一个QuickStart可以下载,QuickStart是一个项目源码,演示了如何开发一个SmarterTag项目。
将下载的SmarterTag中的文件解压到磁盘上的某处,比如“C:\SmarterTag”,然后运行reg.bat文件,将SmarterTag注册到计算机上。然后我们要做的,就是打开VS.NET 2003,创建一个普通的类库项目,并且在项目中引用Microsoft.PRC.Office.SmarterTag.dll程序集。
下面演示的,是开发一个能够寻找到正文中的“kane”,然后显示一个标签,上面的菜单操作可以将正文中的“kane”修改为“kaneboy”的智能标签(这个示范也包含在QuickStart里面)。效果图如下:
首先,在 这里下载SmarterTag,除了SmarterTag之外,还有一个QuickStart可以下载,QuickStart是一个项目源码,演示了如何开发一个SmarterTag项目。
将下载的SmarterTag中的文件解压到磁盘上的某处,比如“C:\SmarterTag”,然后运行reg.bat文件,将SmarterTag注册到计算机上。然后我们要做的,就是打开VS.NET 2003,创建一个普通的类库项目,并且在项目中引用Microsoft.PRC.Office.SmarterTag.dll程序集。
下面演示的,是开发一个能够寻找到正文中的“kane”,然后显示一个标签,上面的菜单操作可以将正文中的“kane”修改为“kaneboy”的智能标签(这个示范也包含在QuickStart里面)。效果图如下:
一个SmarterTag必须实现ISmarterTag接口:
public class FindKaneboy : ISmarterTag
ISmarterTag接口要求我们的类实现如下的方法和属性:
public void Init(String applicationName)
{
// 初始化代码
}
Init()可以让我们的SmarterTag在载入时,进行一些初始化工作。比如从后台载入客户名单等等。
public Boolean IsMatch(String text)
{
return text.ToLower().Trim() == "kane";
}
IsMatch()用来判断参数中的文本是否符合智能标签要标记的文本。在这里,只要文本是“kane”就行了。
public String[] ActionTypeNames
{
get
{
return new String[] {"SmarterTag.QuickStart.ReplaceKane, SmarterTag.QuickStart"};
}
}
ActionTypeNames属性的作用是,决定在智能标签的菜单上,要出现哪些菜单项。每个菜单项都是一个实现了IAction接口的类。这里需要返回一个字符串数组,数组里面的每个元素,是一个菜单项对应的类的类型全名。这个返回的字符串数组的数量,也就决定了智能标签上会显示多少个操作菜单项。
接着我们就要构建一个实现了IAction接口的类了,IAction表示智能标签上的一个菜单项:
public class ReplaceKane : IAction
IAction只有一个属性和一个方法需要实现:
public String Caption
{
get
{
return "补充为“kaneboy”";
}
}
Caption属性返回要显示在菜单项上的文本。
public void InvokeAction(Object target, String applicationName, String text)
{
Range rng = target as Range;
Object start = rng.Start;
Object end = rng.End;
Range rng2 = rng.Document.Range(ref start, ref end);
Object unit = WdUnits.wdCharacter;
Object count = 3;
rng2.MoveEnd(ref unit, ref count);
Object end = rng.End;
Range rng2 = rng.Document.Range(ref start, ref end);
Object unit = WdUnits.wdCharacter;
Object count = 3;
rng2.MoveEnd(ref unit, ref count);
if (rng2.Text != "kaneboy")
{
rng.Text = "kaneboy";
}
}
OK,InvokeAction()方法稍微复杂一点,因为这个方法就是当用户点击智能标签上的这个菜单项时,要执行的代码。target参数表示在宿主程序(host application)中智能标签所标记的那块文本区域所对应的对象。宿主程序的不同,这个对象类型也不尽相同,对于Word而言,target是一个Range类型的对象。第二个参数applicationName标识了宿主程序的名称。第三个参数text是智能标签所标记的文本内容。
在上面InvokeAction()方法中,代码将智能标签所标记的文本内容从“kane”修改为了“kaneboy”。
由于我们编写的是完全的.Net程序,所以InvokeAction()是可以做任何.Net代码可以做的事情的(在权限允许的情况下)。比如显示一个MessageBox,或者显示一个WinForms窗口,或者调用WebService......这里就是业务逻辑代码的主要落脚点。
QuickStart中另外包含的SmarterTag识别了“kaneboy”,和上一篇Blog所说的那个标记博客堂最新文章作者的智能标签。
{
rng.Text = "kaneboy";
}
}
OK,InvokeAction()方法稍微复杂一点,因为这个方法就是当用户点击智能标签上的这个菜单项时,要执行的代码。target参数表示在宿主程序(host application)中智能标签所标记的那块文本区域所对应的对象。宿主程序的不同,这个对象类型也不尽相同,对于Word而言,target是一个Range类型的对象。第二个参数applicationName标识了宿主程序的名称。第三个参数text是智能标签所标记的文本内容。
在上面InvokeAction()方法中,代码将智能标签所标记的文本内容从“kane”修改为了“kaneboy”。
由于我们编写的是完全的.Net程序,所以InvokeAction()是可以做任何.Net代码可以做的事情的(在权限允许的情况下)。比如显示一个MessageBox,或者显示一个WinForms窗口,或者调用WebService......这里就是业务逻辑代码的主要落脚点。
QuickStart中另外包含的SmarterTag识别了“kaneboy”,和上一篇Blog所说的那个标记博客堂最新文章作者的智能标签。
本文转自 kaneb0y 51CTO博客,原文链接:http://blog.51cto.com/kaneboy/281334,如需转载请自行联系原作者