Реактивное расширение в msword - PullRequest
0 голосов
/ 20 декабря 2010

Мне интересно, можно ли использовать Reactive Extensions в Word.Я видел это, когда Джефф показывает, как подключить событие открытия рабочей книги в Excel http://social.msdn.microsoft.com/Forums/en/rx/thread/5ace45b1-778b-4ddd-b2ab-d5c8a1659f5f.

Интересно, смогу ли я сделать то же самое в слове.

Я получил этодалеко ....

     public static class ApplicationExtensions
  {
    public static IObservable<Word.Document> DocumentBeforeSaveAsObservable(this Word.Application application)
    {
      return Observable.Create<Word.Document>(observer =>
      {
        Word.ApplicationEvents4_DocumentBeforeSaveEventHandler handler = observer.OnNext;
        application.DocumentBeforeSave += handler;

        return () => application.DocumentBeforeSave -= handler;
      });
    }
  }

но я получаю ошибку Нет перегрузки для 'OnNext' соответствует делегату 'Microsoft.Office.Interop.Word.ApplicationEvents4_DocumentBeforeSaveEventHandler

Может кто-нибудь указать мне правНаправление.

С уважением

Майк

1 Ответ

1 голос
/ 20 декабря 2010

Ваша проблема связана с подписями делегатов.

IObserver<T>.OnNext определяется как void (T value)

, тогда как ApplicationEvents4_DocumentBeforeSaveEventHandler определяется как void (Document doc, ref bool SaveAsUI, ref bool Cancel)

Если вам нужно только испустить Document (а не другие детали, например сделать его отменяемым), вы можете сделать что-то вроде этого:

public static IObservable<Word.Document> DocumentBeforeSaveAsObservable(
    this Word.Application application)
{
    return Observable.Create<Word.Document>(observer =>
    {
        Word.ApplicationEvents4_DocumentBeforeSaveEventHandler handler = 
            (doc, ref saveAsUI, ref cancel) => observer.OnNext(doc);

        application.DocumentBeforeSave += handler;

        return () => application.DocumentBeforeSave -= handler;
    });
}

Если вам требуются все данные, вам нужно создать некоторый класс-оболочку, последовательность IObservable может выдавать только один тип:

public class DocumentBeforeSaveEventArgs : CancelEventArgs
{
    public Document Document { get; private set; }
    public bool SaveAsUI { get; private set; }

    public DocumentBeforeSaveEventArgs(Document document, bool saveAsUI)
    {
        this.Document = document;
        this.SaveAsUI = saveAsUI;
    }
}

И тогда вы можете использовать его так:

public static IObservable<Word.Document> DocumentBeforeSaveAsObservable(
    this Word.Application application)
{
    return Observable.Create<Word.Document>(observer =>
    {
        Word.ApplicationEvents4_DocumentBeforeSaveEventHandler handler = 
            (doc, ref saveAsUI, ref cancel) => 
            {
                var args = new DocumentBeforeSaveEventArgs(doc, saveAsUI);

                observer.OnNext(args);

                cancel = args.Cancel;
            };

        application.DocumentBeforeSave += handler;

        return () => application.DocumentBeforeSave -= handler;
    });
}
...