Outlook VSTO - 文件夹限制

3

我有一个小的Outlook 2010插件,需要限制自定义文件夹上的一些操作:

  • 我能否防止用户重命名文件夹?
  • 是否可以防止用户将任何项目移动到该文件夹中?我知道ItemAdd事件,但这只在项目被移动后才触发。这对我来说太晚了。
  • 是否可能禁用文件夹的上下文菜单(右键单击)?

非常感谢!

// 编辑:我认为我已经找到了解决上下文菜单问题的方法。这样做可以吗?还是有缺陷?

outlook.FolderContextMenuDisplay += DisableArchiveFolderContextMenu;
private void DisableArchiveFolderContextMenu(Office.CommandBar commandBar, MAPIFolder folder)
{
  if (folder.Name.Equals(Settings.Default.ArchiveFolderName))
  {
    // Disable the context menu
    commandBar.Enabled = false;
  }
  else
  {
    commandBar.Enabled = true;
  } 
}
1个回答

4
请查看BeforeItemMove,防止用户将项目移动到您的文件夹中。需要将此事件附加到您想要监视的每个文件夹 - 我不知道是否有全局的BeforeItemMove。您将需要递归迭代每个邮箱文件夹或依附于Explorer.FolderSwitch并附加您的项监听器。 FolderSwitch 有一定限制,因为您仍然可以通过检查员 Ribbon、OWA 或 EWS 移动项目而无需更改文件夹。
要防止用户重命名文件夹,可以使用StorageItem来保留实现了FolderChange的上下文父文件夹的文件夹名称。
public partial class ThisAddIn
{
    Outlook.Folder folder;
    Outlook.Folder customFolder;
    Outlook.Folders mailbox;
    Outlook.Explorer explorer;

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        explorer = Globals.ThisAddIn.Application.ActiveExplorer();
        explorer.FolderSwitch += new Outlook.ExplorerEvents_10_FolderSwitchEventHandler(explorer_FolderSwitch);

        mailbox = Globals.ThisAddIn.Application.Session.DefaultStore.GetRootFolder().Folders;
        if (mailbox.Cast<Outlook.Folder>().Where(c => c.Name == "Custom Folder").Count() == 0)
        {
            customFolder = mailbox.Add("Custom Folder") as Outlook.Folder;
            Outlook.StorageItem si = customFolder.GetStorage("Custom Folder Storage", Outlook.OlStorageIdentifierType.olIdentifyBySubject);
            si.UserProperties.Add("PermanentFolderName", Outlook.OlUserPropertyType.olText).Value = customFolder.Name; // store persistent name
            si.Save();
        }
        else
            customFolder = mailbox["Custom Folder"] as Outlook.Folder;

        mailbox.FolderChange += new Outlook.FoldersEvents_FolderChangeEventHandler(mailbox_FolderChange);
    }

    void explorer_FolderSwitch()
    {
        folder = explorer.CurrentFolder as Outlook.Folder; // grab new handle
        folder.BeforeItemMove += new Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(folder_BeforeItemMove);
    }

    void mailbox_FolderChange(Outlook.MAPIFolder Folder)
    {
        Outlook.Folder folder = Folder as Outlook.Folder;
        Outlook.StorageItem si = folder.GetStorage("Custom Folder Storage", Outlook.OlStorageIdentifierType.olIdentifyBySubject);
        if (si.Size > 0 && si.UserProperties.Count > 0 && si.UserProperties["PermanentFolderName"].Value != folder.Name)
            folder.Name = si.UserProperties["PermanentFolderName"].Value; // override users name change
    }


    void folder_BeforeItemMove(object Item, Outlook.MAPIFolder MoveTo, ref bool Cancel)
    {
        if (MoveTo.Name == "Custom Folder")
            Cancel = true; // disallow moving items here
    }
}

非常感谢!钩取资源管理器文件夹切换对我很有帮助! - silent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接