【问题标题】:How to implement a modal pop-up window on an app (mlapp)?如何在应用程序(mlapp)上实现模态弹出窗口?
【发布时间】:2020-03-25 03:27:39
【问题描述】:

我想创建一个模态弹出窗口,其中包含许多 uiedit、uimenu 和 uipushbutton 控件。此模式弹出窗口应出现在 MATLAB 应用程序的顶部(使用应用程序设计器构建;而不是使用 GUIDE)。当模式弹出窗口处于活动状态时,父应用 UIFigure 应该是灰色的,类似于打开 uiconfirm 对话框时发生的情况。是否有未记录的方式或其他解决方法来实现这种类型的 UI 元素?

这个想法是用户单击主应用程序上的“设置”按钮并弹出模式对话框,同时停用主应用程序控件,以允许调整设置。

【问题讨论】:

    标签: matlab-app-designer


    【解决方案1】:

    查看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 appssharing data within app designer 的文档以及this answer。或者,您可以利用 mlapps 是 handle 超类的成员这一事实,因此具有内置事件 ObjectBeingDestroyed。您可以为此事件构造一个侦听器(请参阅addlistenerthis)并将其绑定到主应用程序中的方法,然后根据设置应用程序上所做的更改更新主应用程序。

    或者:

    如果 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
    

    -干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多