我目前正在使用Visual Studio 2013使用Office 2013加载项。 我创建了一个带有按钮的功能区,该按钮显示一个小窗口:
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仍可由用户编辑)?
编辑:创建MailItem后,Outlook-UI冻结。当时,Windows窗体仍然打开,我可以像往常一样使用Outlook-UI。
答案 0 :(得分:2)
修改强>
尝试使用myMailItem.Display(true);
更改myMailItem.Display(false);
,因为MailItem.Display文档指出false是默认模式参数。如果设置为true,outlook将冻结,直到准备就绪。
OLD ANSWER (在大多数UI冻结情况下,这将解决问题,但是这种情况有所不同):
通过继续你所说的话听起来像发送邮件方法在发送主要线程之前一直保持主线程,这将导致主UI冻结。处理冻结UI的最佳方法是thread方法,或者有时您可以使用dispatcher timer并将方法放在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
上面的代码将在与运行UI的主线程分开的新线程中执行setFaxNumber方法,这意味着它不会阻止任何UI加载。
如果您需要更多信息,请询问我可以将其添加到我的答案:)