Как написать собственный макет в ExtJs 4 или 3 - PullRequest
3 голосов
/ 17 марта 2011

Я хочу написать свой собственный макет .. (например, vbox, border и так далее) ... Что я хочу сделать, это создать макет, который поместит его содержимое в середину (вертикальный - средний, по горизонтали - посередине) ..

Есть ли кто-нибудь, кто мог бы показать мне, как этот элемент управления будет выглядеть в extJs, или может предоставить некоторые ссылки, которые могут быть полезны?


У меня есть этот пример из

http://dev.sencha.com/deploy/dev/examples/layout-browser/layout-browser.html

Ext.ux.layout.CenterLayout = Ext.extend(Ext.layout.FitLayout, {
// private
setItemSize : function(item, size){
    this.container.addClass('ux-layout-center');
    item.addClass('ux-layout-center-item');
    if(item && size.height > 0){
        if(item.width){
            size.width = item.width;
        }
        item.setSize(size);
    }
}
});

Ext.Container.LAYOUTS['ux.center'] = Ext.ux.layout.CenterLayout;

Но это дает мне больше вопросов, чем ответов .. Что такое setItemSize Как это работает? Когда? Зачем? ЭСТ. Для чего нужен item.setSize? Как это устроено? Когда? Зачем? ЭСТ.

Ответы [ 3 ]

4 голосов
/ 17 марта 2011

посмотрите примеры ExtJS 3, там уже есть Ext.ux.Layout.CenterLayout в пользовательских макетах, может быть, стоит начать?

http://dev.sencha.com/deploy/dev/examples/layout-browser/layout-browser.html


Редактировать: Попробуйтеэто расширение пользовательского макета, оно центрирует элемент в горизонтальном и вертикальном центре его контейнера

Ext.ns('Ext.ux.layout');

Ext.ux.layout.CenterLayout = Ext.extend(Ext.layout.ContainerLayout, {
    monitorResize:true,
    type: 'ux.center',
    getLayoutTargetSize : function() {
        var target = this.container.getLayoutTarget();
        if (!target) {
            return {};
        }
        return target.getStyleSize();
    },
    onLayout : function(ct, target){
        Ext.ux.layout.CenterLayout.superclass.onLayout.call(this, ct, target);
        if(!ct.collapsed){
            this.setItemSize(this.activeItem || ct.items.itemAt(0), this.getLayoutTargetSize());
        }
    },
    setItemSize : function(item, size){
        var left = (size.width - item.getWidth()) / 2;
        var top  = (size.height - item.getHeight()) / 2;

        var pos = Ext.apply(item.getEl().getPositioning(), {
            position : 'absolute',
            left     : left,
            top      : top
        });
        item.getEl().setPositioning(pos);
    }
});
Ext.Container.LAYOUTS['ux.center'] = Ext.ux.layout.CenterLayout;
2 голосов
/ 14 октября 2011
Ext.create('Ext.container.Viewport', {
        layout: {
            type: 'hbox',
            pack: 'center',
            align: 'middle'
        },
        items: [
            {
                html: 'Hello World'
            }
        ]
    });
2 голосов
/ 21 марта 2011

Ext.layout.ContainerLayout (базовый класс для макетов) имеет метод doLayout, который запускает рендеринг вашего контейнера.

В случае FitLayout , он переопределяет и вызывает пользовательскую функцию setItemSize, которая вызывает собственный setSize для первого элемента контейнера (или выбранного элементаесли есть), чтобы соответствовать размеру контейнера (я думаю, максимально).

Проверьте также следующие пользовательские макеты: http://layoutscroll.demo.revolunet.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...