2011-04-15 82 views
7

我正在使用ExtJS并运行一个类似桌面的应用程序。有一件事让我烦恼,就是当一个新窗口打开时(绑定在视口的中心区域内),它总是在视口的左上角打开。ExtJS打开新窗口作为平铺

如果有多个窗口打开,我希望他们瓷砖所以他们不只是坐在ontop的彼此......

任何想法的?

(我最初的想法是循环throught在WindowMgr窗户,检查是否有一个目前在0,0。如果是,检查100,100等,直到一个是免费的。)

希望这是有道理的!

回答

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(); 

这种实现是足够满足我的需求,但可以站在作出了这样的事情作为检查的重新定位窗口是否被突破的更复杂视口边界。

+0

感谢您的回答!我喜欢它如何作为组件的一个属性添加,很好的工作! – neolaser 2011-04-17 23:04:45

+0

喜欢这种方法,但是这对ExtJS4有效吗?我收到了'无法识别的createSequence'错误。 – JayCrossler 2011-08-30 02:03:20

+0

这是为ExtJS 3编写的。v4的许多更改之一是删除添加到全局对象的方法,例如添加到函数的createSequence方法。这可以通过调用Ext.Function.createSequence来取代,但不能保证其余部分能够正常工作。 – owlness 2011-09-01 02:30:26

1

没有什么内置的,所以我认为你上面概述的方法是相当合理的。另外请记住,您可能需要根据您的应用程序允许的情况来处理隐藏/最小化/最大化窗口。