2013-06-21 2 views
3

папки я немного Outlook 2010 AddIn и необходимо ограничить некоторые действия на пользовательской папке:Перспективы VSTO - ограничения

  • Могу ли я каким-то образом предотвратить пользователя от переименования папки?
  • Возможно ли предотвратить перемещение пользователем какого-либо элемента в папку? Я знаю событие ItemAdd, но это только после того, как элемент уже перемещен. Это слишком поздно для меня.
  • Можно ли отключить контекстное меню (щелкните правой кнопкой мыши) папки?

Большое спасибо!

// edit: Я думаю, что нашел решение проблемы контекстного меню. Это нормально или есть ли недостаток в этом?

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; 
    } 
} 

ответ

4

Взгляните на BeforeItemMove для предотвращения пользователей от перемещения элементов в папку. Это событие нужно будет привязать к каждой папке, которую вы заинтересованы в просмотре - нет глобального BeforeItemMove, о котором я знаю. Вам придется рекурсивно перебирать каждую папку почтового ящика или защелку на Explorer.FolderSwitch и присоединять свой прослушиватель. У FolderSwitch есть ограничения, поскольку вы все же можете перемещать элементы без переключения папок через ленту Inspector, 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 
    } 
} 
+0

Большое спасибо! Привязка к переключателю папки проводника сделала для меня трюк! – silent