对于VSTO Word加载程序:保存后是否有事件发射



注意:尽管我的问题与VSTO Word Post Save事件相同,但目标和目标(以及所需的代码)是不同的。vsto Word post保存事件状态的OP:

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

我的需求不同。请参阅我的OP。

注释的结尾

我有一个 VSTO的字母加载项,旨在操纵RTF文件的各种元素(仅RTF文件)。加载项由功能区按钮调用。如果用户打开RTF文档,然后进行save-as,则我想捕获事件,以便我可以检查为保存AS选择的文件名,并禁用如果扩展名不在.RTF(如果扩展名),则调用我的加载项。

在我的功能区类功能区负载方法(事件处理方法中,我的功能区设计器文件: this.Load += new Microsoft.Office.Tools.Ribbon.RibbonUIEventHandler(this.Ribbon1_Load)中宣称的),我已经编码了各种可用的事件(例如Globals.ThisAddIn.Application.DocumentChange += Application_DocumentChange;Globals.ThisAddIn.Application.DocumentOpen += Application_DocumentOpen;),但是所有可用的事件都在触发之前触发save-as发生,而不是之后。我还在这种功能区负载方法中放了一个断点。保存之后,它没有再次执行(我并不感到惊讶)

我想念什么吗?对于我的vsto Word加载程序,在我的功能区类中可捕获的save-as事件后是否有一个事件,它将提供为save-as选择的文件的名称?

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

在Microsoft开发人员网络上归功于约瑟夫·福克斯(Joseph Fox)。我的代码来自文档保存事件

注意:我的VSTO色带类称为ClsLesCaveat。这是一个新组,其中有两个按钮位于现有Insert表中。它是仅使用VS Pro 2017中的VSTO设计师创建的。

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

1)如果有人使用没有.rtf扩展名的单词打开文件,则应禁用我的功能区按钮

2)如果某人使用Word打开.RTF文件(我的按钮已启用),但是如果将其保存到non-.rtf文件中,则应禁用该non-.rtf文档的我的功能区按钮

注意:不在乎保存,因为我的功能区按钮在打开或保存下启用/禁用 - 否则

using System;
using System.IO;
namespace LesCaveatAddIn
{
    public partial class ThisAddIn
    {
        private bool allowSave = false;
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            this.Application.DocumentBeforeSave += Application_DocumentBeforeSave;
            this.Application.DocumentOpen += Application_DocumentOpen;
        }
        # On open, disable buttons, enable buttons only if file extension is .RTF
        private void Application_DocumentOpen(Microsoft.Office.Interop.Word.Document Doc)
        {
            string extension = (Path.GetExtension(Doc.FullName)).ToUpper();
            Type type = typeof(ClsLesCaveat);
            ClsLesCaveat ribbon = Globals.Ribbons.GetRibbon(type) as ClsLesCaveat;
            ribbon.objButtonAddFouoCaveat.Enabled = false;
            ribbon.objButtonAddLesCaveat.Enabled = false;
            if (extension.Equals(".RTF"))
            {
                ribbon.objButtonAddFouoCaveat.Enabled = true;
                ribbon.objButtonAddLesCaveat.Enabled = true;
            }
        }
        # On save-as, handle the save-as myself. Cancel the save-as (since I just handled it). Then, disable buttons, enable buttons only if the save-as file extension is .RTF.
        private void Application_DocumentBeforeSave(Microsoft.Office.Interop.Word.Document Doc, ref bool SaveAsUI, ref bool Cancel)
        {
            if (!allowSave)
            {
                allowSave = true;
                if (SaveAsUI)
                {
                    // Display Save As dialog
                    Microsoft.Office.Interop.Word.Dialog d = Globals.ThisAddIn.Application.Dialogs[Microsoft.Office.Interop.Word.WdWordDialog.wdDialogFileSaveAs];
                    object timeOut = 0;
                    d.Show(ref timeOut);
                }
                else
                {
                    // Save without dialog
                    Doc.Save();
                }
                allowSave = false;
                Cancel = true;
                string extension = (Path.GetExtension(Doc.FullName)).ToUpper();
                Type type = typeof(ClsLesCaveat);
                ClsLesCaveat ribbon = Globals.Ribbons.GetRibbon(type) as ClsLesCaveat;
                ribbon.objButtonAddFouoCaveat.Enabled = false;
                ribbon.objButtonAddLesCaveat.Enabled = false;
                if (extension.Equals(".RTF"))
                {
                    ribbon.objButtonAddFouoCaveat.Enabled = true;
                    ribbon.objButtonAddLesCaveat.Enabled = true;
                }
            }
        }
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }
        #region VSTO generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }
        #endregion
    }
}

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

documentbeforesave确实提供了参数,使开发人员抑制内置的UI(Saveas对话框),并取消触发事件的操作。这允许开发人员提供自己的界面以保存(AS) will 启用确定何时保存文档(AS)并采取所需的任何操作,具体取决于文件名,扩展或任何条件。

也可以使用Word的内置Saveas对话框,而不是创建自己的对话框,尽管这在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);
    }

可用的对话框参数在此处列出。

相关内容

  • 没有找到相关文章

最新更新