ExtJS如何将新窗口平铺打开

7
我正在使用ExtJS并运行桌面应用程序。有一件事情让我困扰,就是当打开新窗口时(绑定在视口的中心区域内),它总是在视口的左上角打开。
如果打开多个窗口,我希望它们可以平铺,这样它们就不会只停留在一个窗口之上...
有什么想法吗?
(我的初步想法是在WindowMgr中循环遍历窗口,并检查是否有一个位于0,0处。如果是,则检查100,100等,直到找到一个空闲的位置。)
希望这样说得清楚!
3个回答

5

我基本上已经按照你所描述的做法来做:

Ext.Window.prototype._autoTile = function() {
    var x = 10,
        y = 10;

    Ext.WindowMgr.each(function( win ) {
        if ( win === this )  return;

        var pos = win.getPosition();

        if ( pos[0] > (x - 15)
            && pos[0] < (x + 15)
            && pos[1] > (y - 15)
            && pos[1] < (y + 15)
        ) {
            x += 15;
            y += 15;
        }
    }, this);

    this.setPagePosition(x, y);
};

Ext.Window.prototype.initComponent =
    Ext.Window.prototype.initComponent.createSequence(function() {
        if ( this.autoTile ) {
            this.on('show', this._autoTile, this, {single: true});
        }
    });

var win = new Ext.Window({
    width: 300,
    height: 300,
    autoTile: true
});

win.show();

这个实现对我的需求来说还算够用,但可以更复杂一些,例如检查重新定位的窗口是否超出了视口边界。

谢谢你的回答!我喜欢它作为组件属性添加的方式,做得很好! - neolaser
喜欢这种方法,但是在ExtJS4上能用吗?我得到了一个“未识别的createSequence”错误。 - JayCrossler
这段代码是针对ExtJS 3编写的。v4版本中的许多变化之一是删除了添加到全局对象的方法,例如添加到Function的createSequence方法。调用Ext.Function.createSequence可以替换掉这部分,但是无法保证其余部分仍然可用。 - owlness

1

没有内置的功能可以做到这一点,所以我认为你上面概述的方法是相当合理的。同时请记住,根据您的应用程序允许的内容,您可能需要处理隐藏/最小化/最大化的窗口。


1

正如已经说明的那样,没有内置的功能来支持此操作。

在 ExtJS 论坛上有一篇旧的讨论线程关于这个问题,虽然它是针对 2.x 版本的,但也许你可以从中获取一些实现的思路。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接