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()
たが、何も変わりません。
この問題についてさらに考えはありますか?