Outlook 2013插件邮件项创建阻止Outlook

本文关键字:Outlook 创建 2013 插件 | 更新日期: 2023-09-27 18:12:12

我目前正在与Visual Studio 2013一起玩Office 2013插件。我已经创建了一个Ribbon和一个按钮,显示一个小的Windows窗体:

        private void outterMailCreateNewFaxBTN_Click(object sender, RibbonControlEventArgs e)
    {
        CreateNewFax cnf = new CreateNewFax(this);
        cnf.Show();
    }

当用户单击表单上的一个按钮时,将创建一个新的MailItem(其中包含一些信息)。

private void button1_Click(object sender, EventArgs e)
    {
        this.Dispose();
        this.outterMailRibbon.setFaxNumber(faxNumber, this);
    }

下面是setFaxNumber-Method:

public void setFaxNumber(String faxNumber, CreateNewFax cnf)
    {
        cnf = null;
        //mother.Dispose();
        this.faxNumber = faxNumber;
        Outlook.Application application = Globals.ThisAddIn.Application;
        Outlook.MailItem myMailItem = (Outlook.MailItem)application.CreateItem(Outlook.OlItemType.olMailItem);
        myMailItem.To = this.faxNumber;
        myMailItem.Subject = "[FAX:" + this.faxNumber + "]";
        myMailItem.BodyFormat = Outlook.OlBodyFormat.olFormatPlain;
        ((Outlook.ItemEvents_10_Event)myMailItem).Send += new Microsoft.Office.Interop.Outlook.ItemEvents_10_SendEventHandler(ThisAddIn_Send);
        this.gMailItem = myMailItem;
        myMailItem.Display(true);
    }

我目前面临的问题是,当用户点击表单上的特定按钮后,Outlook主进程被阻塞,UI冻结,直到新创建的消息被发送或丢弃。

如何避免这种行为(使用户能够显示来自outlook的其他邮件,而这个新创建的MailItem仍然可以由用户编辑)?

编辑:Outlook-UI在MailItem创建后冻结。此时,Windows Form仍然是打开的,我可以像往常一样使用Outlook-UI。

Outlook 2013插件邮件项创建阻止Outlook

EDIT:

尝试将myMailItem.Display(true);更改为myMailItem.Display(false);作为MailItem。显示文档说明false是默认的模态参数。如果设置为true, outlook将冻结,直到它准备好。


旧答案(在大多数UI冻结情况下,这将解决问题,但这种情况不同):

继续你所说的,听起来就像send mail方法在主线程被发送出去之前一直保持着,这将导致主UI冻结。处理冻结UI的最佳方法是将方法线程化,或者有时您可以使用分派器计时器并将方法放入tick中。

我不确定这是否会起作用,因为我是从记忆中写的,但如果你要线程函数,你可以这样做:

    var thread = new Thread( () =>
    {
        this.outterMailRibbon.setFaxNumber(faxNumber, this);
    });
    thread.Start();
    thread.Join(); // The thread will auto leave and close once the execution is complete

上面的代码将在一个新的线程中执行setFaxNumber方法,该线程与运行UI的主线程分开,这意味着它不会占用任何UI加载。

如果你需要更多的信息,只要问,我可以把它添加到我的答案:)