无法监听 UIAxes 的 YLim 属性

cod*_*tor 7 matlab listener observable matlab-figure matlab-app-designer

MATLAB 提供了该addlistener函数。

侦听器允许我们跟踪对象属性的变化并对其采取行动。例如,我们可以创建一个非常简单的侦听器,当对象的'YLim'属性axes发生更改时,它将在命令窗口中显示一条消息:

% Example using axes
ax = axes();
addlistener(ax, 'YLim', 'PostSet', @(src, evnt)disp('YLim changed'));
Run Code Online (Sandbox Code Playgroud)

尝试平移轴或放大/缩小,看看会发生什么。这工作正常。

我需要做同样的事情,但使用 anuiaxes代替。

不幸的是,我们似乎不允许这样做。尝试运行以下示例:

% Example using uiaxes
ax = uiaxes();
addlistener(ax, 'YLim', 'PostSet', @(src, evnt)disp('YLim changed'));
Run Code Online (Sandbox Code Playgroud)

它抛出这个错误:

错误使用 matlab.ui.control.UIAxes/addlistener 添加 PostSet 侦听器时,类“matlab.ui.control.UIAxes”中的属性“YLim”未定义为 SetObservable。

我已经阅读了“监听属性值的变化”和“观察属性值的变化”的文章,我了解到必须声明一个属性才能SetObservable被监听:

classdef PropLis < handle
   properties (SetObservable)
      ObservedProp = 1 % <-- Observable Property
   end
end
Run Code Online (Sandbox Code Playgroud)

我试过通过查看UIAxes类定义,edit matlab.ui.control.UIAxes但这是不可能的,因为它是一个P-file

如果'YLim'不可观察,那么我如何跟踪此属性的变化?

我在 MATLAB R2018b 中使用App Designer

Dev*_*-iL 7

我们应该将侦听器附加到内部Axes对象,而不是它UIAxes本身。尝试这个:

hFig = uifigure();
hAx = uiaxes(hFig);
addlistener(struct(hAx).Axes, 'YLim', 'PostSet', @(src, evnt)disp("YLim changed"));
hAx.YLim = [0 2];
Run Code Online (Sandbox Code Playgroud)

如果有人想知道,我是通过反复试验发现的。

在 R2018a 和 R2018b 上测试。

  • rhoo ... 非常好。我试图挖掘,但被踢出了所有这些受保护的财产。使用 `struct` 绕过 MATLAB 保护的技巧......天才! (2认同)