zoukankan      html  css  js  c++  java
  • 如何使用.NET开发全版本支持的Outlook插件产品(四)——进阶探讨

    插件项目所有代码都已经上传至

    https://github.com/VanPan/TestOutlookAdding

     

    如何定制Ribbon在不同界面的显示

    实际使用过程中出现的问题

    这个问题的来自十分实际的几个事件,首先请大家回忆现在的插件入口类的声明特性,以及插件Ribbon界面XML的定义。

    [COMAddin("Test Addin For Outlook", "", 3), CustomUI("TestOutlookAddin.RibbonUI.xml"), RegistryLocation(RegistrySaveLocation.CurrentUser)]
        [Guid("AFE67651-951D-4A42-8CAB-E9BF7E219DDF"), ProgId("TestAddinForOutlook")]
        public class COMEntry : COMAddin
    请特别注意其中的
    CustomUI("TestOutlookAddin.RibbonUI.xml")

    而这个XML文件,大家已经再熟悉不过

    <?xml version="1.0" encoding="utf-8" ?>
    <customUI onLoad="LoadAction"  xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
      <ribbon>
        <tabs>
          <tab id="RibbonAddinSampleTabCS35" label="插件标签">
            <group id="group1" label="分组名">
              <button id="customButton1" size="large" onAction="ButtonAction" getLabel="GetButtonLabel" getImage="GetButtonImage"/>
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>

    当大家运行现在的插件,会发现,新增的Robbin标签会出现在所有Outlook打开的界面中,例如:

    Outlook启动界面

    image

    新建邮件界面

    image

    如果按照现在的代码,所有的Outlook界面都会出现插件的标签。现在,在实际更深层次的使用过程中,我们面临两个问题:

    1.如果我只想在主界面或者新建邮件等特定界面,加载插件标签,应该怎么办?

    2.如果我想把插件嵌入到系统Ribbon的Tab中,应该怎么办?

    在特定的界面加载特定的Ribbon

    首先回答问题1

    解决动态加载Ribbon的关键,在于重写COMAddin类中的GetCustomUI方法,如下:

    public override string GetCustomUI(string RibbonID)
            {
                if (RibbonID != "Microsoft.Outlook.Explorer") return "";
                var ui = base.GetCustomUI(RibbonID);
                return ui;
            }

    这个方法在每次打开新界面时都会调用。这样定义以后,通过判断RibbonID来区分当前打开的界面的ID来返回相应的XML内容,即可满足我们的要求。

    返回的结果字符串是XML文档的内容,而不是XML文件夹哦,这点需要注意。在上面的代码中,返回的就是项目默认XML文档TestOutlookAddin.RibbonUI.xml中的内容,因为是用的基类方法。

    大家可以在调试状态下,通过打开不同的界面来验证每个界面的RibbonID是什么,在此不再赘述。

    在系统级别Ribbon中注入新控件

    现在再讨论第二个问题,如果有需求,在系统“邮件”标签中加入自定义的按钮,应该怎么办?

    方法是在XML文件中加入新的声明,关键是使用idMso元素来指定系统级Tab,我们将XML文件改成如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <customUI onLoad="LoadAction"  xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
      <ribbon>
        <tabs>
          <tab idMso="TabView">
            <group id="group2" label="新分组">
              <button id="customButton2" size="large" onAction="ButtonAction" getLabel="GetButtonLabel" getImage="GetButtonImage"/>
            </group>
          </tab>
          <tab id="RibbonAddinSampleTabCS35" label="插件标签">
            <group id="group1" label="分组名">
              <button id="customButton1" size="large" onAction="ButtonAction" getLabel="GetButtonLabel" getImage="GetButtonImage"/>
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>

    可以看到,在原来id是RibbonAddinSampleTabCS35的tab项上面,我们定义了新的tab,idMso是TabView。

    这个声明,指定了采用Outlook中的“视图”标签,我们看到运行后的效果如下:

    image

    这样,在“视图”标签的最后,我们就增加了一个新的分组和按钮。

    附上查看所有Office Ribbon ID的方法

    http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=6627

    通过结合上面两个方法,我们就可以对系统的菜单项进行动态全面控制了,对于Ribbon的自定义也方便了许多。

     

    如何增加邮件签名

    下面我们讨论另外一个在开发中也会遇到的问题:如何读取和控制邮件内容。

    在此列举一个最实际的场景:当邮件打开时,我们想要动态分析邮件内容,并进行后续操作。当邮件发送时,我们希望可以动态添加一些文字来作为签名或者其它推广类信息。

    如果需要实现这个功能,方案如下:

    首先,在OnConnection事件的处理方法中,加入以下代码:

    // register add signature after new mail
                    var i = _outlookApplication.Inspectors as OutLook.Inspectors;
                    if (i != null)
                    {
                        i.NewInspectorEvent += i_NewInspectorEvent;
                    }

    这段代码的主要目的是为新建一个项目(邮件、联系人、会议等)注册一个事件。

    随后我们在事件处理函数中这样写:

    private OutLook.MailItem _newMail;
    
            void i_NewInspectorEvent(OutLook._Inspector Inspector)
            {
                _newMail = Inspector.CurrentItem as OutLook.MailItem;
                if (_newMail == null || !String.IsNullOrEmpty(_newMail.EntryID)) return;
                _newMail.SendEvent += newMail_SendEvent;
            }

    这段代码的意义,在于判断打开的是新建邮件的重口,这样我们就可以获得当前正在新建的邮件实例对象了。

    同时我们对邮件的发送事件再次注入事件

    void newMail_SendEvent(ref bool Cancel)
            {
                _newMail.HTMLBody = _newMail.HTMLBody.Replace("</body>", "<p class=MsoNormal><span lang=EN-US><a href="http://www.camcard.com">Click Me</a></span></p></body>");
            }

    以上这段代码的作用是在邮件发送时自动在后面加入签名超链接。但是还是有些地方值得稍微解释一下:

    首先,邮件主流分为三种格式:普通文本、HTML、RTF。默认的邮件格式可以在Outlook 2013的“文件”——“选项”——“邮件”中找到设置。

    image

    我们可以在MailItem.MailFormat属性中看到当前邮件的撰写格式,如果邮件是HTML格式的,我们需要设置MailItem.HTMLBody;如果邮件是RTF格式的,我们需要相应设置MailItem.RTFBody。

    在现在的例子中,我们使用的是HTML格式,如果是HTML格式,我们可以理解这封邮件就是一个HTML页面,那拼接签名的方法最简单的莫过于将HTML中的</body>关闭标签替换成一段签名然后再重现关闭。

    对于RTF格式,也是有其它格式可以进行编辑,但是我在这方面没有深入调研。

    PS:如果你不知道HTML,请对HTML进行一定量的学习,因为现在Web开发也是非常主流的一块,作为程序员,应该对所有平台的开发都有一定的了解,HTML又是网页开发最基础的一块。

    总结

    到此,我们已经对插件的进一步开发又有了更多的了解,可以控制的范围也越来越深入,后面的开发教程,等待我收集更多的实际案例,并逐步在后续的分享中加入到博客中。

    后续我们将正式介绍安装包的制作,WIX安装包不是仅仅用在插件安装,也可以用于基于.NET的所有PC平台的安装项目中。

  • 相关阅读:
    代码、复制[置顶] 跑起来,第一个sshby小雨
    返回、参数了解Javascript函数:parseInt()by小雨
    代码、复制Javascript执行效率小结by小雨
    图片、JQuery学习笔记(图片的展开和伸缩)by小雨
    登录、项目Spring mvc Session拦截器by小雨
    社区、标签jsp中获取状态怎么写?by小雨
    升级、地方LKDBHelper 使用FMDB 对数据库的自动操作by小雨
    广播、应用Android BroadcastReceiver(一)by小雨
    调试、手机手游开发知识(三)--NDK联机调试by小雨
    设置、数值【Cocos2DX 】初窥门径(11)CCUserDefault:保存数据by小雨
  • 原文地址:https://www.cnblogs.com/vanpan/p/4359693.html
Copyright © 2011-2022 走看看