Как получить метод события или запуска после закрытия документа?

У меня есть надстройка Word (VSTO), которая будет обрабатывать текстовый документ после того, как он будет закрыт пользователем. К сожалению, событие DocumentBeforeClose возникает даже в тех случаях, когда документ действительно не собирается закрываться.

Пример: событие возникает перед отображением диалогового окна, предлагающего пользователю сохранить документ. Пользователей спрашивают, хотят ли они сохранить, с помощью кнопок «Да», «Нет» и «Отмена». Если пользователь выбирает «Отмена», документ остается открытым даже при возникновении события DocumentBeforeClose. По этой причине существует какой-либо способ или метод сделать event или Method, которые будут raised или run после закрытия документа.

Я пробовал сделать вот так:

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

person hoss77    schedule 03.10.2016    source источник


Ответы (1)


Как вы уже сказали, с помощью обработчика событий DocumentBeforeClose нельзя быть уверенным в том, что после этого документ действительно будет закрыт. Однако вы можете получить полный контроль над процессом закрытия, переопределив команду File Close:

  • Добавьте команды в 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];
    }
    

Полный пример настройки команд Word можно найти на MSDN:

Временное изменение назначения команд на ленте Office Fluent

person Dirk Vollmar    schedule 04.10.2016
comment
Большое спасибо за помощь @DirkVollmar. Кстати, диалоговое окно все еще предлагает пользователю закрыть документ без сохранения последних изменений. поэтому я хочу, чтобы после получения результата из этого диалогового окна с запросом было поднято четное значение. - person hoss77; 04.10.2016
comment
@ hoss77: Извините за путаницу, пожалуйста, посмотрите мою правку. - person Dirk Vollmar; 04.10.2016
comment
Да, вы правы, я могу запустить свой метод после этого кода: Application.ActiveDocument.Close(WdSaveOptions.wdPromptToSaveChanges); Но проблема все еще существует, потому что пользователь может щелкнуть кнопку отмены. И как я могу это узнать? или как я могу показать это поле SaveChanges и получить DialogResult. - person hoss77; 04.10.2016
comment
@ hoss77: вы сможете проверить, открыт ли документ после вызова Close. - person Dirk Vollmar; 04.10.2016
comment
Как я могу проверить, открыт ли документ после вызова Close. - person hoss77; 04.10.2016
comment
Есть ли способ показать это диалоговое окно SaveChanges и получить DialogResult - person hoss77; 04.10.2016
comment
Большое вам спасибо за вашу помощь. Привет, @DirkVollmar, Application.ActiveDocument.Close(WdSaveOptions.wdPromptToSav‌​eChanges);, просто закрой документ, а не окно приложения. как я могу закрыть окно приложения. - person hoss77; 04.10.2016