#extjs #resize #panel #scale
#extjs #изменить размер #панель #масштаб
Вопрос:
У меня есть панель, содержащая две дочерние панели. родительская панель использует макет «границы», в то время как две дочерние панели используют макеты «форма» и «столбец» соответственно. теперь, как я могу заставить эти две дочерние панели соответственно изменять размер при изменении размера окна, т. Е. убедиться, что соотношение размеров этих двух панелей является постоянным.
Спасибо!
мои коды следующие:
itemRts = {
xtype: 'panel',
title: 'Route',
region: 'north',
autoHeight: true,
layout: 'form',
width: 294,
bodyStyle: 'padding:10px 12px 10px',
id: 'ROUTE_PANEL',
el: 'Route_Setup',
items: [
{
xtype: 'button',
text: 'Go',
anchor: '0',
id: 'GO_BTN'
}]
};
itemEvts = {
xtype: 'panel',
title: 'Events',
region: 'center',
layout: 'column',
tpl: 'Please put events here.',
//bodyStyle: 'padding:10px 12px 10px',
border: false,
hideBorders: true,
id: 'EVENT_PANEL',
el: 'Event_Legend',
autoScroll: true
};
newView = new Ext.Viewport({
layout: "border",
items: [
{
xtype: 'panel',
margins: '10 0 10 10',
region: 'center',
width: 200,
layout: 'border',
split: true,
boxMaxWidth: 280,
minWidth: 280,
id: 'RTS_EVTS_REGION',
collapseMode: 'mini',
items: [
itemRts,
itemEvts]
}]
});
как изменить приведенные выше коды, чтобы заставить их работать так, как я хочу?
еще раз спасибо!
Ответ №1:
Вы можете установить событие изменения размера для панели контейнера и вызвать метод «dolayout» для их дочерних элементов в случае изменения размера :
newView = new Ext.Viewport({
layout: "border",
items: [
{
xtype: 'panel',
margins: '10 0 10 10',
region: 'center',
width: 200,
layout: 'border',
split: true,
boxMaxWidth: 280,
minWidth: 280,
id: 'RTS_EVTS_REGION',
collapseMode: 'mini',
items: [itemRts, itemEvts],
listeners: {
'resize': function () {
itemRts.doLayout();
itemEvts.doLayout();
}
}
}]
});
Комментарии:
1. Именно так, как я бы это сделал, вызов doLayout на panel должен обновить их.
2. почему браузер говорит «itemRts.doLayout не является функцией»?
3. Попробуйте с помощью «itemRts.doLayout()». Если itemRts — это панель, она должна работать.
Ответ №2:
для вашего основного контейнера я предлагаю макеты hbox и / или vbox. эти макеты — то, что вы ищете. вот пример:
var testPanel = new Ext.Viewport( {
id : 'vp_test',
layout : 'hbox',
align : 'stretch',
items : [
{
id : 'pnl_child_1',
title : 'Test 1',
flex : 2
},
{
id : 'pnl_child_2',
title : 'Test 2',
flex : 3,
layout : 'vbox',
align : 'stretch',
items : [
{
id : 'pnl_child_3',
title : 'Test 3',
flex : 1
},
{
id : 'pnl_child_4',
title : 'Test 4',
flex : 1
}
]
},
]
} );
вы можете обратиться к документации, viewport, hbox, vbox
itemRts = {
xtype: 'panel',
title: 'Route',
// region: 'north', <<< we don't need this anymore
flex: 1, // this means that this container has 1 flexible share
// autoHeight: true, <<< this will ruin all layout
layout: 'form',
// width: 294, <<< we don't need this anymore
bodyStyle: 'padding:10px 12px 10px',
id: 'ROUTE_PANEL',
el:'Route_Setup',
items: [
{
xtype:'button',
text:'Go',
anchor:'0',
id:'GO_BTN'
}
]
};
itemEvts = {
xtype: 'panel',
title: 'Events',
// region: 'center', <<< we don't need this anymore
flex: 1, // this means that this container has 1 flexible share
layout: 'column',
tpl: 'Please put events here.', // <<<< if you're not going to use xTemplates you should use html property instead
//bodyStyle: 'padding:10px 12px 10px',
border: false,
hideBorders: true,
id: 'EVENT_PANEL',
el : 'Event_Legend',
autoScroll: true
};
newView = new Ext.Viewport({
//// if you have only one child component you can use fit layout for viewport.
//// and consider removing that only child. use viewport as main container.
layout : "border",
items: [
{
xtype: 'panel',
margins: '10 0 10 10',
region: 'center',
// width: 200, <<<< width has no effect on center region
/// we'll use hbox with align stretch
layout: 'hbox',
align: 'stretch',
// split: true, <<<< split has no effect on center region
// boxMaxWidth: 280, <<<< no effect
// minWidth: 280, <<<< no effect
id: 'RTS_EVTS_REGION',
// collapseMode: 'mini', <<<< collapse properties has no effect on center region
items: [
itemRts,
itemEvts
]
}
]
});
Комментарии:
1. привет, я прилагаю свои коды к своему вопросу. я попытался изменить это на основе вашего предложения, но все еще не могу добраться до сути. не могли бы вы любезно дать мне больше подсказок? Спасибо!
2. прежде всего, автоматический рост — это не то, что вы хотите. он изменяет размер контейнера путем вычисления его дочерних элементов и не позволит вам указать какую-либо высоту. и расположение границ совсем не плавное. использование макетов horizontalBox и verticalBox обеспечит вам наилучшие гибкие макеты. я собираюсь изменить свой образец вашим кодом.