查看uiwait的文档,它准确地解释了如何达到您想要的效果。
为了遵循提供有意义答案的最佳实践,我可能会按如下方式处理这个问题。
为“设置”按钮创建回调:
- 通过将其属性设置为“变灰”所需的主应用程序的 UI 元素
Enable
'off'
- 实例化您为设置 UI 创建的 *.mlapp
从这里开始,有很多可能性。一种方法是uiwait
设置 mlapp 的UIFigure,因为默认情况下,它包含在 mlapp 定义的公共属性中。如果您想等到设置 UI 关闭,您可以简单地使用uiwait(settingsApp.UIFigure);
. 关闭设置 UI 后,您可以重新启用所有主要应用程序组件以取消“灰色”它们。
例如,您的“设置按钮”回调可能如下所示:
function onRequestSettings(app, event)
% set main figure's UI elements gray
% Assuming you want all elements gray
set(app.UIFigure.Children, 'Enable', 'off');
% create the settings UI by instantiating it here
settingsApp = settingsUI();
% wait until the figure closes
uiwait(settingsApp.UIFigure);
% ... SEE NOTE BELOW CODE BLOCK! ... %
% Now that the settings UI is closed,
% set main figure's UI elements back to normal.
% Again, assuming all elements here
set(app.UIFigure.Children, 'Enable', 'on');
end
笔记:
虽然上面的代码块会产生你想要的行为,但我没有展示如何在设置应用程序和主应用程序之间共享数据。我假设,因为你没有明确要求这个,你有一些想法。如果没有,我将向您指出在应用程序设计器中创建多窗口应用程序和共享数据的文档以及此答案。handle
或者,您可以利用 mlapps 是超类成员的事实,因此具有内置事件ObjectBeingDestroyed
. 您可以为此事件构造一个侦听器(请参阅addlistener
和this)并将其绑定到主应用程序中的方法,然后根据设置应用程序上所做的更改更新主应用程序。
或者:
如果 settingsUI 存储在主应用程序的属性中,例如app.settingsUI
,并且被主应用程序实例化,但可能隐藏,startupFcn
那么每次按下“设置按钮”时都不需要重新实例化,您可以简单地将其向前推进figure(app.settingsUI.UIFigure);
. 然后将其设为“模态”uiwait(app.settingsUI.UIFigure);
并覆盖 settingsUIcloseRequestFcn
以释放代码执行暂停uiresume
。关闭回调可能如下所示:
classdef settingsUI < matlab.apps.AppBase
...
function UIFigureCloseRequest(app,event)
% override close request to prevent deleting the app
% hide the settings window to appear as though it was closed
app.UIFigure.Visible = 'off';
% resume code execution so that main app can continue to run.
uiresume(app.UIFigure);
end
...
end
-干杯