Как настроить фон фигуры App Designer?

Я хочу прикрепить логотип или изменить весь фон Дизайнера приложений uifigure. Как это может быть сделано?


comment
Также неплохо сделать тег для app designer.   -  person asys    schedule 12.01.2017
comment
@hbaderts tnx за создание тега   -  person asys    schedule 12.01.2017


Ответы (2)


  • Если вы хотите установить сплошной цвет фона для всей фигуры, существует документированный способ сделать это, например:

    % When creating a new uifigure:
    fig = uifigure('Color',[R G B])
    % if the uifigure already exists:
    fig.Color = [R G B];
    
  • Если вы хотите изменить цвет фона только для определенного региона, вы можете добавить uipanel без заголовка или границы (uipanel(...,'BorderType','none','Title','','BackgroundColor',[R G B])).
  • Если вы хотите установить изображение в качестве фона всей фигуры:

    function q41602238a
    %% Turn off some warnings:
    warning off Matlab:structOnObject
    warning off Matlab:HandleGraphics:ObsoletedProperty:JavaFrame
    
    %% 0. Create a uifigure:
    app = uifigure();
    %% 1. Get a handle to the webwindow:
    while true
      try   
         win = struct(struct(app).Controller).Container.CEF;
         break
      catch
         pause(0.1); % Give the figure (webpage) some more time to load
      end
    end 
    %% 2. Find the data_tag of the DOM element we want to edit:
    data_tag = char(struct(app).Controller.ProxyView.PeerNode.getId);
    
    %% 3. Manipulate the DOM via a JS command
    while true
      try
        win.executeJS(['dojo.style(dojo.query("[data-tag^=''' data_tag ''']")[0],"background-image","url(https://upload.wikimedia.org/wikipedia/commons/8/80/Wikipedia-logo-v2.svg")']);
        break
      catch
        pause(0.1); % Maybe JS is still not ready.
      end
    end
    

    Результат:

    Полный фон

  • Если вы хотите установить изображение в качестве фона только для определенного региона:

    function q41602238b
    %% Turn off some warnings:
    warning off Matlab:structOnObject
    warning off Matlab:HandleGraphics:ObsoletedProperty:JavaFrame
    
    %% 0. Create a some element:
    app = uifigure();
    pnl = uipanel(app);
    %% 1. Get a handle to the webwindow:
    while true
      try   
         win = struct(struct(app).Controller).Container.CEF;
         % disp(win.URL);
         break
      catch
         pause(0.1); % Give the figure (webpage) some more time to load
      end
    end 
    %% 2. Find the id of the DOM element we want to edit:
    data_tag = char(struct(pnl).Controller.ProxyView.PeerNode.getId);
    widgetId = win.executeJS(['dojo.getAttr(dojo.query("[data-tag^=''' data_tag ''']")[0],"widgetid")']);
    
    %% 3. Manipulate the DOM via a JS command
    dojo_style_prefix = ['dojo.style(dojo.query("#' widgetId(2:end-1) '")[0],'];
    while true
      try
        win.executeJS([dojo_style_prefix '"background-image","url(https://upload.wikimedia.org/wikipedia/commons/8/80/Wikipedia-logo-v2.svg")']);
    
        break
      catch
        pause(0.1); % Maybe JS is still not ready.
      end
    end
    

    Результат:

    Панель БГ

Заметки:

  1. Последние два примера основаны на этих двух сообщениях: 1, 2, а принцип работы заключается в добавлении записи background-image: "..." к свойству style некоторого желаемого элемента пользовательского интерфейса (который оказывается HTML div ).

  2. Инструмент для программного управления фигурами App Designer можно найти в этом репозитории GitHub.

  3. Изображение в качестве примера представляет собой .svg, что интересно, потому что мы можем экспортировать "обычные" фигуры MATLAB в этот формат, а затем использовать их в качестве фона для uifigure :)

person Dev-iL    schedule 08.03.2017

К сожалению, я пока не могу комментировать, поэтому вот еще один ответ.

Начиная с Matlab 2017a, у контроллера больше нет свойства Container. Это работает:

warning off Matlab:structOnObject
warning off Matlab:HandleGraphics:ObsoletedProperty:JavaFrame

win = struct(struct(struct(app).Controller).PlatformHost).CEF;

data_tag = char(struct(app).Controller.ProxyView.PeerNode.getId);

win.executeJS(['dojo.style(dojo.query("[data-tag^=''' data_tag ''']")[0],"background-image","url(https://upload.wikimedia.org/wikipedia/commons/8/80/Wikipedia-logo-v2.svg")']);

Существует также возможность найти все активные веб-окна с помощью

webWindows = matlab.internal.webwindowmanager.instance.findAllWebwindows();

к сожалению, я еще не выяснил, какое окно принадлежит какому UIFigure (можно было бы использовать Title или Position для фильтрации, но два одинаковых UIFigures вызовут проблемы).

Отказ от ответственности, Давиде Миани разместил эту информацию здесь: https://undocumentedmatlab.com/blog/customizing-uifigures-part-1#comment-406524

person Jan    schedule 14.02.2018