2

我有一个 Word 插件 (VSTO),它将在用户关闭 Word 文档后对其进行处理。不幸的是,DocumentBeforeClose即使在文档不会真正关闭的情况下也会引发该事件。

例如:在向用户显示提示用户保存文档的对话框之前引发该事件。系统会询问用户是否要使用“是”、“否”和“取消”按钮进行保存。如果用户选择取消,即使DocumentBeforeClose引发了事件,文档仍保持打开状态。出于这个原因,有任何方法或方法可以制作eventMethod将在文件关闭后raised或之后。run

我试着这样做:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{            
    Globals.ThisAddIn.Application.DocumentBeforeClose += new Microsoft.Office.Interop.Word.ApplicationEvents4_DocumentBeforeCloseEventHandler(this.Application_DocumentBeforeClose);

    // I want some thing like this
    Globals.ThisAddIn.Application.DocumentAfterClose += new Microsoft.Office.Interop.Word.ApplicationEvents4_DocumentOpenEventHandler(this.Application_DocumentAfterClose);
}

public void Application_DocumentBeforeClose(Word.Document doc, ref bool Cancel)
{
    MessageBox.Show(doc.Path, "Path");            
}

// I want some thing like this
public void Application_DocumentAfterClose(string doc_Path)
{
    MessageBox.Show(doc_Path, "Path");
}
4

1 回答 1

2

正如您已经说过的,您无法通过DocumentBeforeClose事件处理程序确定文档实际上是在之后关闭的。但是,您可以通过覆盖File Close命令来完全控制关闭过程:

  • 将命令添加到您的功能区 XML(对于 idMso FileClose):

    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" 
              onLoad="OnLoad"> 
       <commands> 
         <command idMso="FileClose" onAction="MyClose" /> 
       </commands> 
       <ribbon startFromScratch="false"> 
         <tabs> 
            <!-- remaining custom UI goes here -->
         </tabs> 
       </ribbon> 
    </customUI>
    
  • 在代码中提供相应的回调方法:

    public void MyClose(IRibbonControl control, bool cancelDefault)
    {
        var doc = Application.ActiveDocument;
        doc.Close(WdSaveOptions.wdPromptToSaveChanges);
    
        // check whether the document is still open
        var isStillOpen = Application.IsObjectValid[doc];
    }
    

可以在 MSDN 上找到如何自定义 Word 命令的完整示例:

临时改变 Office Fluent 功能区上的命令用途

于 2016-10-04T07:44:17.163 回答