2

PowerPoint 2010アドインCommandBars.OnUpdateで、図形の動きや同様のイベントを登録するためにイベントをサブスクライブしました。

 ppt = Globals.ThisAddIn.Application;
 ppt.CommandBars.OnUpdate += CommandBars_OnUpdate;

これはしばらくの間うまくいきます。ただし、最終的にイベントは発生しなくなります。少なくとも、登録されたイベントハンドラーは呼び出されていません。何がこの振る舞いを引き起こしているのか理解できませんでした。少し不確定なようです。デバッグ出力に表示される例外はスローされません。これはしばらくしてから発生し、ユーザーの操作によるものではないようです。

これはオブジェクトの変更によるものだと思いましたCommandBars。そこで、これらの変更をチェックするタイマーを追加しました。ただし、最後のオブジェクト==.Equals()の比較の両方で、ティックごとに認識された変更が発生します。これはほとんどありません。

また、イベントハンドラーを定期的に(1分ごとに)更新しようとしましたが、これも機能しません。

ppt.CommandBars.OnUpdate -= CommandBars_OnUpdate;
ppt.CommandBars.OnUpdate += CommandBars_OnUpdate;

イベントは本当にしばらくして停止しますか?オブジェクトの移動、サイズ変更、削除などを検出する他の方法はありますか?


アップデート

その間に、私はアドインを再構築しました。これで、問題を再現できるようになりました。方法は次のとおりです。

CreateRightEyeCopy()アドインのリボンには、ViewModelのメソッドを呼び出すボタンがあります。このメソッドGetNextPairId()では、ViewModelの別のメソッドが呼び出されます。そして、この呼び出しには問題があるようです。GetNextPairId()メソッドが問題であることを確認するために、をすぐに0を返すように変更しました。

return 0次の行の結果のスタックトレースは次のとおりです。

ViewModel.GetNextPairId()
[External Code]
ViewModel.CreateRightEyeCopy()
Button's event handler

2つの関数の間に外部コードがあるのはなぜだろうか。このコードでOnUpdateイベントを停止できますか?

誰かが興味を持っているなら、ここに2つの関数のコードがあります:

CreateRightEyeCopy()

try
{
    var sel = ppt.ActiveWindow.Selection;
    if (sel.Type == PpSelectionType.ppSelectionShapes)
    {
        foreach (Shape s in sel.ShapeRange)
        {
            var pair = FindStereoPair(s);
            //Only add a new pair, if shape is not in a pair already
            if (pair == null)
            {
                // ** return; **
                int id = GetNextPairId(s.Parent);
                return; //for debugging purposes
            }
        }
    }
}
catch (Exception x)
{
    Debug.WriteLine("Exception occured during creation of stereo pair: " + x.Message);
}

GetNextPairId()

return 0;

の呼び出しの前にreturnステートメントを挿入するとGetNextPairId()OnUpdate続行します。

また、非同期で呼び出しようとしましCreateRightEyeCopy()たが、何も変わりません。

この問題についてさらに考えはありますか?

4

2 に答える 2

1

実際の答えではありませんが、MSDNは次のように述べています。「このイベントは、主にカスタムコマンドバーがCOMアドインによって追加または削除されたことを確認するために使用することを強くお勧めします。」

他のイベントを追跡するには、おそらく別のアプローチを選択する必要があります。

後付けとして、すべての例外(UnhandledException、ThreadException)をキャプチャしていることを確認しますか?

于 2012-09-11T08:22:53.690 に答える
1

これは非常に古い質問ですが、同様の問題がありました。Outlookで、CommandBars.OnUpdateのイベントが失われました。初めて会議を開いたときは実行されませんでしたが、予定を開いたときは常に実行されました。全体的に非常にランダムな動作。

修正は、次の投稿の抜粋で説明されています: https ://social.msdn.microsoft.com/Forums/en-US/c6472472-2ae4-496a-b553-a931aeb7a8f6/excel-commandbars-onupdate-event-handler-停止-応答しますか?forum = vsto

私は2つのことを変更しました:

  • 直接のCommandBarsObjectへの参照ではなく、ローカル変数に格納する必要があります(どういうわけか、参照はガベージコレクションされていると思います)
  • 実際のイベントサブスクリプションは明示的に_CommandBarsEvents_OnUpdateEventHandler(厳密には必要ではないと思いますが、現在は機能しています)

CommandBarsオブジェクトへのグローバル参照

private Microsoft.Office.Core.CommandBars bars = Globals.ThisAddIn.Application.CommandBars

そして、割り当て機能で

 bars.OnUpdate += new Microsoft.Office.Core._CommandBarsEvents_OnUpdateEventHandler(CommandBars_OnUpdate);
于 2019-10-23T13:44:33.950 に答える