【发布时间】:2019-10-23 21:44:33
【问题描述】:
在我的 PowerPoint 2010 Addin 中,我订阅了 CommandBars.OnUpdate 事件以记录形状和类似事件的移动:
ppt = Globals.ThisAddIn.Application;
ppt.CommandBars.OnUpdate += CommandBars_OnUpdate;
这在一段时间内效果很好。但是,最终该事件停止被触发。好吧,至少注册的事件处理程序没有被调用。我无法弄清楚,是什么导致了这种行为。这似乎有点不确定。不会引发将出现在调试输出中的异常。这似乎是在一段时间后发生的,并不是由用户操作引起的。
我认为,这将是由于 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(),但这并没有改变任何东西。
对这个问题有什么进一步的想法吗?
【问题讨论】:
-
我很想知道您是否在这方面取得了更多进展,您最终采用了什么方法/发现了什么?
-
@Cilvic 我用
WindowSelectionChange事件解决了这个问题,该事件被可靠地触发。此外,我使用了一个计时器来反映部分变化。
标签: .net events vsto powerpoint