2010-12-19 10 views
0

リアクティブエクステンションをWordで使用できるかどうかは疑問です。私はこれを見ましたが、Jeffはワークブック公開イベントをどのようにワイヤリングするのかをExcel http://social.msdn.microsoft.com/Forums/en/rx/thread/5ace45b1-778b-4ddd-b2ab-d5c8a1659f5fで示しています。mswordのリアクティブエクステンション

私は言葉で同じことをすることができるのだろうかと思います。

私は....これまで

 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

あなたの問題は、デリゲート署名の問題です。 ApplicationEvents4_DocumentBeforeSaveEventHandlervoid (Document doc, ref bool SaveAsUI, ref bool Cancel)

あなただけ(それは解約作るような、ないその他の詳細)Documentを放出する必要がある場合として定義されているのに対し、

IObserver<T>.OnNextは、あなたがこのような何かを行うことができますvoid (T value)

として定義されます:あなたはすべてのデータを必要とした場合は

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; 
    }); 
} 
関連する問題