Smarter Tag

上一篇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必须实现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);

   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所说的那个标记博客堂最新文章作者的智能标签。

posted on 2005-02-20 05:10  kaneboy  阅读(129)  评论(0编辑  收藏  举报

导航