Примечание. Хотя мой вопрос находится на том же уровне, что и Событие 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
}
}