Взгляните на 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
}
}
Большое спасибо! Привязка к переключателю папки проводника сделала для меня трюк! – silent