2016-10-03 2 views
2

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

Ex: Событие поднимается до того, как пользователю откроется диалоговое окно с предложением сохранить документ. Пользователи спрашивают, хотите ли они сохранить с помощью кнопки «Да», «Нет» и «Отмена». Если пользователь выбирает Отмена, документ остается открытым, хотя событие 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"); 
} 

ответ

2

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

  • Добавить команды в вашу ленте 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:

Temporarily Repurpose Commands on the Office Fluent Ribbon

+0

Большое вам спасибо за ваш помогает @DirkVollmar. Кстати, диалоговое окно все еще запрашивает пользователя, когда он закрывает документ, не сохраняя последние изменения. поэтому я хочу, чтобы даже это было поднято после получения результата из этого диалогового окна подсказки. – hoss77

+0

@ hoss77: Извините за путаницу, см. Мое редактирование. –

+0

Да, вы правы Я могу запустить мой метод после этого кода: 'Application.ActiveDocument.Close (WdSaveOptions.wdPromptToSaveChanges);' Но проблема все еще существует, потому что пользователь может нажать кнопку отмены. И как я могу это знать? или как я могу показать это поле SaveChanges и получить 'DialogResult'. – hoss77

Смежные вопросы