5

私は Outlook プログラミングが初めてなので、最初のステップ (後でより高度な) は次のタスクです。

  • 新しいリボン (Ribbon1) タブを作成します (エクスプローラーと新しいインスペクターに表示されます)。
  • メールを選択 (Explore) または開く (Inspector) と、リボン タブにメールの件名が表示されます (前述のテスト)。

エクスプローラーの部分は簡単に始められましたが、新しいインスペクターに対して上記を行うのに問題があります

私はさまざまなアプローチを試しましたが、どれもうまくいかないようです:

  • NewInspector で Globals.Ribbons[inspector].Ribbon1 を参照しようとしましたが、それは常に null です

  • NewInspector で Activate イベントをサブスクライブしてそこから実行しようとしましたが、Application.ActiveInspector() が null であり、NewInspector イベントからインスペクターのグローバル コピーを保存すると、最初は機能しません。新しいインスペクター (2 回目以降は既読メールでのみ。作成メールでは不可)

  • リボン ロード イベントを使用しようとしましたが、それは初回のみ発生します

  • Globals.Ribbons.Ribbon1 メンバーを使用しようとしましたが、それは初めて機能します

(私は NewInspector のサンプルをたくさん見つけましたが、誰もこれ以外のリボンを変更したくないようですhttps://stackoverflow.com/questions/7852017/outlook-2007-ribbon-object-reference-not-set-オブジェクトのインスタンスへの変換であり、そのための答えはありません)

これは私を夢中にさせています... 本当にそのような単純なタスクを行う方法はありません!?

参考までにサンプルコード

    void InspectorsNewInspector(Outlook.Inspector inspector)
    {
        AddInspectorEventHandlers(inspector);
    }

    private void AddInspectorEventHandlers(Outlook.Inspector inspector)
    {
        if (inspector == null)
        {
            return;
        }

        Ribbon1 ribbon1 = Globals.Ribbons[inspector].Ribbon1; //This always return null!!!

        ((Outlook.InspectorEvents_10_Event)inspector).Activate += InspectorActivate;
        ((Outlook.InspectorEvents_10_Event)inspector).Close += InspectorClose;

        _openInspectors.Add(inspector);
    }
4

2 に答える 2

0

「NewInspector」イベント中に、カスタム リボンが読み込まれませんでした。コードをデバッグすると、「NewInspector」イベントの後でのみカスタム リボン デザイナーに送られることがわかります。できることは、カスタム リボンのロード イベント中に必要なものを実装することです。あれは

private void MyRibbon_Load(object sender, RibbonUIEventArgs e){}

ここで、現在アクティブなインスペクターを取得できます。そこから、必要なアイテムを取得できます。

元 :

        Inspector inspector = Globals.WPTAddIn.Application.ActiveInspector();
        if (inspector != null)
        {
            if (inspector.CurrentItem != null)
            {
                if (inspector.CurrentItem is MeetingItem)
                {
                    MeetingItem meetingItem = (MeetingItem)inspector.CurrentItem;}}}
于 2013-02-23T18:59:25.000 に答える
0

私は今日同じ問題に遭遇し、回避策を思いつきました。私は基本的に、作成したばかりRibbonのにアクセスしようとしています。MailItem

回避策として、各リボンをループしましたGlobals.Ribbons(インスペクター インデクサーを使用せずに、null 参照が得られるため)。各Ribbonオブジェクトで、 type のコンテキストを確認しますInspector。次に、 で等価性チェックを実行して、Inspector.CurrentItemそれらの参照が等しいかどうかを判断できます。それらが等しい場合、私はそれを使用することを知っていますRibbon

ここにスニペットがあります

Outlook.MailItem mail = (Outlook.MailItem)this.Application.CreateItem(Outlook.OlItemType.olMailItem);
Outlook.Inspector currentInspector = (Outlook.Inspector)mail.GetInspector;

Ribbon2 currentRibbon = null;
foreach (Ribbon2 ribbon in Globals.Ribbons)
{
    var ribbonInspector = (Outlook.Inspector)ribbon.Context;
    if (ribbonInspector.CurrentItem.Equals(currentInspector.CurrentItem))
    {
        currentRibbon = (Ribbon2)ribbon;
        break;
    }
}
于 2014-10-09T17:54:40.430 に答える