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