对于VSTO Word加载项:另存为后会触发事件吗?

时间:2019-03-12 18:13:51

标签: c# ms-word event-handling vsto save-as

注意:尽管我的问题与VSTO Word post save event处于同一水平,但目的和目标(以及由此产生的所需代码)不同。 VSTO Word post save event中的OP指出:

  

将文档保存到磁盘后,我需要捕获该事件,   关闭文件,执行我需要做的然后重新打开。

我的需求不同。见我的OP。

注释结尾

我有一个用于Word的VSTO外接程序,旨在处理RTF文件(仅RTF文件)的各种元素。加载项由功能区按钮调用。如果用户打开一个RTF文档,然后执行save-as,我想捕获一个事件,这样我就可以检查为另存为选择的文件名,并在扩展名为.x的情况下禁用调用我的加载项的按钮。不是.RTF

在我的功能区类功能区加载方法(在我的功能区类的设计器文件中声明的事件处理方法:this.Load += new Microsoft.Office.Tools.Ribbon.RibbonUIEventHandler(this.Ribbon1_Load))中,我编写了各种可用的事件(例如,Globals.ThisAddIn.Application.DocumentChange += Application_DocumentChange;和{{1 }}),但所有可用事件都会在Globals.ThisAddIn.Application.DocumentOpen += Application_DocumentOpen;发生之前而不是之后发生。我还在此功能区加载方法中设置了一个断点。另存为后不会再次执行(我不感到惊讶)

我想念什么吗?对于我的VSTO Word加载项,在save-as事件之后是否触发了一个事件,该事件可以在我的功能区类中捕获,该事件将提供为save-as选择的文件的名称?

更新我的代码以反映Cindy Meister的答案

在Microsoft Developer's Network上记入Joseph Fox。我的代码来自Document Save Event

注意:我的VSTO功能区类名为save-as。这是一个具有两个按钮的新组,位于现有ClsLesCaveat表中。它是在VS Pro 2017中仅使用VSTO设计器创建的。

对我来说,我的功能区按钮需要在两种情况下禁用:

1)如果有人使用不带.RTF扩展名的Word打开文件,则应该禁用我的功能区按钮

2)如果有人使用Word打开.RTF文件(启用了我的按钮),但是如果他们将另存为非.RTF文件,则应该对该非.RTF文档禁用我的功能区按钮。

注意:不要在意保存,因为我的功能区按钮在打开时启用/禁用或另存为

Insert

1 个答案:

答案 0 :(得分:2)

否,没有事件可捕获任何“保存”或“操作后保存”。与保存有关的唯一一个是DocumentBeforeSave

DocumentBeforeSave确实提供了允许开发人员隐藏内置UI(另存为对话框)以及取消触发事件的操作的参数。这使开发人员可以提供自己的保存界面(如),可以用来确定何时保存文档(如)并采取所需的任何操作,具体取决于文件名,扩展名或任何标准。

也可以使用Word的内置“另存为”对话框,而不是自己创建对话框,尽管这在C#中有点复杂,因为它需要使用PInvoke。这是一个示例,可让您了解其工作方式(未经测试,因为我在移动设备上):

    private void ThisDocument_BeforeSave(object sender, object e)
    {
        //Suppress the built-in SaveAs interface (dialog box)
        e.SaveAsUi = false;
        //Cancel the default action
        e.Cancel = true;
        Word.Dialog dlg = wdApplication.Dialogs[Microsoft.Office.Interop.Word.WdWordDialog.wdDialogFileSaveAs];
        //Word dialog box parameters have to be accessed via Late-Binding (PInvoke) 
        //To get the path, use the Name property
        object oDlg = (object)dlg;
        object[] oArgs = new object[1];
        oArgs[0] = (object)@"";
        dlg.Show(ref missing);
        object fileName = oDlg.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, oDlg, oArgs);
    }

here列出了可用的可用对话框参数。