c# - 文档关闭后如何有事件或运行方法?

标签 c# ms-word vsto office-interop word-addins

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

例如:在向用户显示对话框提示用户保存文档之前引发该事件。系统会询问用户是否要使用"is"、“否”和“取消”按钮保存。如果用户选择“取消”,则即使引发了 DocumentBeforeClose 事件,文档仍保持打开状态。 因此,有任何方式或方法可以使事件方法在之后引发运行该文件已关闭。

我尝试这样做:

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");
}

最佳答案

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

  • 将命令添加到功能区 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 命令的完整示例:

Temporarily Repurpose Commands on the Office Fluent Ribbon

关于c# - 文档关闭后如何有事件或运行方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39834041/

相关文章:

C# - 生成 10 个字符的随机字母数字字符串的最有效方法是什么?

c# - 在 C# 和 MySql 中使用 SSL 证书

c# - 运算符 '=='不能应用于 'Thickness'和 'string'类型的操作数

c# - MS Word 2010 无法打开宏存储

c# - 使用 [FindsBy] 属性时将 IWebElements 作为 C#/Selenium 中的集合保存

c#从文本文件复制到word文档

html - 你会如何简化这个过程?

c# - Excel 功能区选项卡选择更改事件

c# - 如何获取所选幻灯片的ID

c# - VSTO - 使用 C# 在 Excel 工作簿中激活 "Track Changes"