查看uiwait 的文档,它准确地解释了如何达到您想要的效果。
为了遵循最佳实践以提供有意义的答案,我可能会按如下方式处理此问题。
为“设置”按钮创建一个回调:
- 通过将
Enable 属性设置为'off' 来“灰显”所需的main 应用程序的UI 元素
- 实例化您为设置 UI 创建的 *.mlapp
从这里开始,有很多可能性。一种方法是在设置 mlapp 的 UIFigure 上设置uiwait,因为默认情况下,它包含在 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
注意:
虽然上面的代码块会产生您想要的行为,但我没有展示如何在设置应用程序和主应用程序之间共享数据。
我假设,因为你没有明确要求这个,你有一些想法。如果没有,我会告诉你creating multi-window apps 和sharing data within app designer 的文档以及this answer。或者,您可以利用 mlapps 是 handle 超类的成员这一事实,因此具有内置事件 ObjectBeingDestroyed。您可以为此事件构造一个侦听器(请参阅addlistener 和this)并将其绑定到主应用程序中的方法,然后根据设置应用程序上所做的更改更新主应用程序。
或者:
如果 settingsUI 存储在主应用程序的属性中,例如 app.settingsUI,并被主应用程序的 startupFcn 实例化,但可能隐藏,那么每次“设置按钮”时都不需要重新实例化按下您可以简单地使用figure(app.settingsUI.UIFigure); 将其向前推进。然后使用uiwait(app.settingsUI.UIFigure); 将其设为“模态”并覆盖settingsUI closeRequestFcn 以使用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
-干杯