我在 Matlab 中遇到了一些关于属性监听器的问题。我已将监听器添加到轴的 XLim
和 YLim
属性,在 PostSet
上触发:
h = addlistener(myaxes,{'XLim','YLim'},'PostSet',@myfunc);
现在我希望我的程序在两个属性都发生变化后执行某些操作,或者如果只有一个属性发生变化,但在后一种情况下,我必须确保另一个没有发生变化。
当在轴上使用缩放工具时,属性总是同时改变,并且总是按照 x
,然后是 y
的顺序改变。所以在这种情况下我不会有问题,但有时我以编程方式设置 XLim
或 YLim
属性并希望触发相同的功能。我必须以某种方式判断是这两个属性中只有一个触发了监听器还是两者都触发了。
在当前阶段,我的回调执行了两次:一次针对 XLim
,一次针对 YLim
。我希望它只执行一次,并且恰好在我知道这两个属性没有进一步变化之后。你知道怎么做吗?
最佳答案
我不相信可以直接检测到“同时”set
,因为实际的属性分配,而不仅仅是 PostSet
事件,是单独执行的,并且没有其他信息传递给 PostSet
回调,让您知道另一个即将到来。在第一个回调中的断点处停止,轴完全更新到它们的新 XLim
而没有任何迹象表明 YLim
即将发生变化。
根据您对代码使用方式的假设以及您的优先级,有多种方法可以组合出解决方法。我能想到的所有原则都至少使用以下原则之一:
- 在某个阶段使用计时器允许可能的
YLim
分配在完成XLim
PostSet
的工作之前触发第二个回调回调 - 为不带
YLim
的XLim
赋值创建一个自定义例程,以某种方式与缩放工具之类的赋值区分开来 - 利用缩放工具首先设置
XLimMode
属性这一事实,无论其值是否发生变化。如果XLim
的值已经是manual
,则以编程方式设置XLim
将不会设置XLimMode
。
关于matlab - 多个属性监听器等待两者触发回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31474017/