Для надстройки VSTO Word: происходит ли событие после Save-As? - PullRequest
1 голос
/ 12 марта 2019

Примечание. Хотя мой вопрос находится на том же уровне, что и Событие VSTO Word после сохранения , цели и задачи (и требуемый требуемый код) различны.ОП в VSTO Word после события сохранения сообщает:

после сохранения документа на диск, мне нужно захватить это событие, закрыть файл, сделать то, что мне нужно сделатьи снова откройте его.

Мои потребности разные.См. Мой OP.

конец заметки

У меня есть надстройка VSTO для Word, предназначенная для манипулирования различными элементами файлов RTF (и толькоRTF файлы).Надстройка вызывается кнопкой ленты.Если пользователь открывает документ RTF, а затем делает save-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?

Обновите мой код, отражая ответ Синди Мейстер

Кредит Джозефу Фоксу в сети разработчиков Microsoft.Мой код, полученный из Событие сохранения документа

Примечание: мой класс ленты VSTO называется ClsLesCaveat.Это новая группа с двумя кнопками, которая находится в существующей таблице Insert.Он был создан с использованием только дизайнера VSTO в VS Pro 2017.

Для меня, кнопки ленты должны быть отключены в двух сценариях:

1) Если кто-то открывает файл с помощью Word, который делаетУ меня нет расширения .RTF, кнопки на ленте должны быть отключены

2) Если кто-то открывает файл .RTF с помощью Word (мои кнопки включены), но если они сохраняются как файлы, отличные от.RTF-файл, кнопки моей ленты должны быть отключены для этого документа, отличного от .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
    }
}

1 Ответ

2 голосов
/ 13 марта 2019

Нет, нет событий для захвата какого-либо сохранения или сохранения после действий. Единственное, что связано с сохранением - это DocumentBeforeSave .

DocumentBeforeSave предоставляет аргументы, которые позволяют разработчику отключить встроенный пользовательский интерфейс (диалоговое окно SaveAs), а также отменить действие, которое вызвало событие. Это позволяет разработчикам предоставлять свой собственный интерфейс для сохранения (как), который будет позволять определять, когда документ сохраняется (как), и предпринимать любые необходимые действия, в зависимости от имени файла, расширения или любых других критериев.

Также возможно работать со встроенным в 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);
    }

Доступные аргументы диалогового окна, которые можно использовать, перечислены здесь .

...