【问题标题】:Outlook vsto - Folder restrictionsOutlook vsto - 文件夹限制
【发布时间】:2013-06-21 10:58:46
【问题描述】:

我有一个小的 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;
  } 
}

【问题讨论】:

    标签: outlook vsto add-in


    【解决方案1】:

    查看BeforeItemMove 以防止用户将项目移动到您的文件夹中。此事件需要附加到您有兴趣观看的每个文件夹 - 我知道没有全局 BeforeItemMove。您将不得不递归地迭代每个邮箱文件夹或锁定Explorer.FolderSwitch 并附加您的项目侦听器。 FolderSwitch 有一些限制,因为您仍然可以在不通过 Inspector 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
        }
    }
    

    【讨论】:

    • 非常感谢!连接到资源管理器文件夹开关对我有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多