.net CommandBars.OnUpdate停止被激发

.net CommandBars.OnUpdate停止被激发,.net,events,vsto,powerpoint,.net,Events,Vsto,Powerpoint,在我的PowerPoint 2010插件中,我订阅了命令栏.OnUpdate事件以注册形状和类似事件的移动: ppt = Globals.ThisAddIn.Application; ppt.CommandBars.OnUpdate += CommandBars_OnUpdate; 这在一段时间内效果很好。但是,最终事件将停止激发。至少注册的事件处理程序没有被调用。我不知道是什么导致了这种行为。这似乎有点不确定。不会引发将出现在调试输出中的异常。看起来,这是在一段时间后发生的,并不是由用户

在我的PowerPoint 2010插件中,我订阅了
命令栏.OnUpdate
事件以注册形状和类似事件的移动:

 ppt = Globals.ThisAddIn.Application;
 ppt.CommandBars.OnUpdate += CommandBars_OnUpdate;
这在一段时间内效果很好。但是,最终事件将停止激发。至少注册的事件处理程序没有被调用。我不知道是什么导致了这种行为。这似乎有点不确定。不会引发将出现在调试输出中的异常。看起来,这是在一段时间后发生的,并不是由用户操作引起的

我假设,这是由于
commandbar
对象的更改。因此,我添加了一个计时器,用于检查这些更改。但是
=
.Equals()
与最后一个对象的比较都会导致每一个勾号都有一个可识别的变化,这是非常不可能的

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

ppt.CommandBars.OnUpdate -= CommandBars_OnUpdate;
ppt.CommandBars.OnUpdate += CommandBars_OnUpdate;
一段时间后,活动真的停止了吗?是否有其他方法检测对象移动、调整大小、删除等


更新 与此同时,我重组了addin。我现在能够重现这个问题。以下是如何:

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

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

ViewModel.GetNextPairId()
[External Code]
ViewModel.CreateRightEyeCopy()
Button's event handler
我想知道,为什么在我的两个函数之间有外部代码。此代码是否会导致
OnUpdate
事件停止

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

CreateRightEyeCopy()

GetNextPairId()

如果在调用
GetNextPairId()
之前插入return语句,则
OnUpdate
将继续

我还尝试异步调用
CreateRightEyeCopy()
,但这并没有改变任何事情

关于这个问题还有什么想法吗?

这不是一个真正的答案,但:“强烈建议此事件主要用于检查COM加载项是否已添加或删除自定义命令栏。”

您可能应该选择不同的方法来跟踪其他事件


事后想一想,您确定捕获了所有异常(未处理异常、ThreadException)?

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

修复在以下帖子中的剪报中进行了描述:

我改变了两件事:

  • 引用不应该是直接CommandBarsObject,而是应该存储在一个局部变量中(我假设引用以某种方式被垃圾收集)
  • 实际的事件订阅是使用
    \u CommandBarsEvents\u OnUpdateEventHandler
    显式进行的(我不认为这是严格必要的,但现在它可以工作了)
命令栏
对象的全局引用

private Microsoft.Office.Core.commandbar=Globals.ThisAddIn.Application.commandbar
在赋值函数中

bar.OnUpdate+=新的Microsoft.Office.Core.\u CommandBarsSevents\u OnUpdate事件处理程序(CommandBars\u OnUpdate);

我知道MSDN是怎么说的。但我看不到其他选择。世界上发生的事件似乎非常罕见。我的代码绝对不会捕捉到任何异常。您是否考虑过订阅
OnWindowsSelectionChange
并在处理程序方法中检查命令栏/功能区状态是否有帮助?是的,但在移动形状时不会触发此事件。我对命令栏/功能区的状态并不感兴趣。事实上,我很惊讶在移动形状时会引发CommandBars.OnUpdate事件。但无论如何,您可能希望查看窗口子类化以获得可靠的解决方案。这是我现在最好的主意——对不起,我帮不上什么忙了。@PaulB。你能给我一点建议吗?你会尝试对哪个窗口进行子类划分/如何以这种方式捕获更改事件?我很想知道你是否在这方面取得了任何进展,你最终采用了什么方法/你发现了什么?@Cilvic我用
WindowSelectionChange
事件解决了这个问题,该事件是可靠触发的。此外,我还使用了计时器来反映部分更改。
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);
}
return 0;