CommandBars.OnUpdate停止被触发

时间:2012-09-08 10:23:43

标签: .net events vsto powerpoint

在我的PowerPoint 2010 Addin中,我订阅了CommandBars.OnUpdate事件来注册形状和类似事件的移动:

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

一段时间以来效果很好。但是,最终该事件不再被解雇。好吧,至少没有调用已注册的事件处理程序。我无法弄清楚是什么导致了这种行为。这看起来有点不确定。抛出的任何异常都不会出现在Debug输出中。看来,这种情况发生在一段时间后,并非由用户操作引起。

我认为,这可能是由于CommandBars对象发生了变化。所以我添加了一个计时器,检查这些更改。但是,==.Equals()与最后一个对象的比较会导致每个滴答都有一个可识别的变化,这是非常不可能的。

我还尝试定期刷新事件处理程序(每1分钟),但这也不起作用:

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

一段时间后事件真的停止了吗?有没有其他方法来检测对象移动,调整大小,删除等?


更新

同时我重组了插件。我现在能够重现这个问题。方法如下:

在插件的功能区中,我有一个按钮,它调用ViewModel上的方法CreateRightEyeCopy()。在此方法中,将调用ViewModel的另一个方法GetNextPairId()。这个电话似乎有问题。我将GetNextPairId()更改为立即返回0以确保方法是问题。

以下是return 0行中的结果堆栈跟踪:

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

我想知道,为什么我的两个函数之间存在外部代码。此代码可以导致OnUpdate事件停止吗?

如果有人感兴趣,这里是两个函数的代码:

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;

如果我在调用GetNextPairId()之前插入一个return语句,那么OnUpdate会继续。

我也试图异步调用CreateRightEyeCopy(),但这不会改变任何内容。

对此问题还有进一步的想法吗?

2 个答案:

答案 0 :(得分:1)

不是真正的答案,而是MSDN says:“强烈建议此事件主要用于检查COM AddIn是否添加或删除了自定义命令栏。”

您应该选择其他方法来跟踪其他事件。

作为事后的想法,您确定要捕获所有异常(UnhandledException,ThreadException)吗?

答案 1 :(得分:0)

我知道这是一个非常老的问题,但是我有一个类似的问题。在Outlook中,我丢失了CommandBars.OnUpdate的事件。它永远不会在我第一次打开会议时运行,而总是在我打开约会时运行。总体而言,行为非常随机。

此修复程序在以下文章的摘要中进行了描述: https://social.msdn.microsoft.com/Forums/en-US/c6472472-2ae4-496a-b553-a931aeb7a8f6/excel-commandbars-onupdate-event-handler-stops-responding?forum=vsto

我改变了两件事:

  • 引用不应直接指向CommandBarsObject,而应存储在局部变量中(我认为引用已被垃圾回收了)
  • 实际的事件订阅明确地与_CommandBarsEvents_OnUpdateEventHandler一起使用(我认为这不是绝对必要的,但现在可以使用了)

CommandBars对象的全局引用

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

在赋值函数中

 bars.OnUpdate += new Microsoft.Office.Core._CommandBarsEvents_OnUpdateEventHandler(CommandBars_OnUpdate);