4

我正在开发一个需要对用户的 Outlook 联系人执行一些处理的应用程序。我目前正在通过遍历 的结果来访问 Outlook 联系人列表,该结果MAPIFolder.Items.Restrict(somefilter)可以在Microsoft.Office.Interop.Outlook.

在我的应用程序中,我的用户需要选择几个联系人来应用某个操作。我想添加一个功能,允许用户从 Outlook 中拖动联系人并将其放在 UI 中的某个 ListBox 上(我在 WPF 中工作,但这可能是更通用的问题)。

我对 C# 和 WPF 很陌生 - 我怎么能:

  1. 在 ListBox 上接收丢弃的项目
  2. 验证它是一个 ContactItem(或包装 ContactItem 的东西)
  3. 将丢弃的项目投射到 ContactItem 以便我可以处理它

谢谢

4

3 回答 3

6

我用 TextBox 试过这个(实际上与 ListBox 没有区别)。

概括 :

在所有 Outlook 联系人中搜索作为文本拖入的联系人。此处的搜索基于此人的全名。

条件):

拖动联系人时,在 Outlook 中选择时必须显示全名。唯一的问题是两个人的全名相同!如果是这种情况,您可以尝试通过组合 ContactItem 属性并在拖动的文本中搜索它们来找到一个人的唯一标识符。

private void textBox1_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetData("Text") != null)
    {                
        ApplicationClass app;
        MAPIFolder mapif;
        string contactStr;

        contactStr = e.Data.GetData("Text").ToString();

        app = new ApplicationClass();                

        mapif = app.GetNamespace("MAPI").GetDefaultFolder(OlDefaultFolders.olFolderContacts);                

        foreach (ContactItem tci in mapif.Items)
        {
            if (contactStr.Contains(tci.FullName))
            {
                draggedContact = tci; //draggedContact is a global variable for example or a property...
                break;
            }                    
        }

        mapif = null;

        app.Quit;
        app = null;
        GC.Collect();
    }
}

当然这段代码是组织优化的,它只是解释使用的方法。

您可以尝试将 Explorer.Selection 属性与 GetData("Text") 结合使用 [以确保它来自 Outlook,或者您可以在 DragOver 事件中使用 GetData("Object Descriptor"),解码内存流,搜索“outlook 》,如果没有找到取消拖动操作] 为什么不拖动多个联系人!

private void textBox1_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetData("Text") != null)
    {
        ApplicationClass app;
        Explorer exp;
        List<ContactItem> draggedContacts;                
        string contactStr;

        contactStr = e.Data.GetData("Text").ToString();

        draggedContacts = new List<ContactItem>();

        app = new ApplicationClass();
        exp = app.ActiveExplorer();
        if (exp.CurrentFolder.DefaultItemType == OlItemType.olContactItem)
        {
            if (exp.Selection != null)
            {
                foreach (ContactItem ci in exp.Selection)
                {
                    if (contactStr.Contains(ci.FullName))
                    {
                        draggedContacts.Add(ci);
                    }
                }
            }
        }

        app = null;
        GC.Collect();
    }
}
于 2009-09-03T11:40:16.313 回答
1

Outlook 联系人在删除时支持以下格式:

(0): "RenPrivateSourceFolder"
(1): "RenPrivateMessages"
(2): "FileGroupDescriptor"
(3): "FileGroupDescriptorW"
(4): "FileContents"
(5): "Object Descriptor"
(6): "System.String"
(7): "UnicodeText"
(8): "Text"

该列表中最有趣的一个(对我而言)是对象描述符,然后它把我引向了一个听起来有类似问题的人:

http://bytes.com/topic/visual-basic-net/answers/527320-drag-drop-outlook-vb-net-richtextbox

在这种情况下,他们检测到它是 Outlook 放置,然后使用 Outlook 对象模型检测当前选择的内容,这意味着它必须是当前放置源。

于 2009-09-03T12:05:02.120 回答
0

您可能会做的是在您的 .wpf 应用程序中接受拖放事件,然后从 Outlook 中获取所选项目并将它们拉入您的应用程序。

更新

将 Outlook PIA 引用添加到您的应用程序。

Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.Explorer activeExplorer = app.ActiveExplorer();
Microsoft.Office.Interop.Outlook.Selection currentSelection = activeExplorer.Selection;

然后您可以遍历 currentSelection 集合以查看用户拖过的内容。

于 2009-07-31T13:42:56.907 回答