htmlayout内嵌普通窗体控件
HTMLayout可以非常方便的嵌入普通控件、和窗体,其他浏览器都没有这功能。看范例里有,这算是HTMLayout一大亮点,可以无限扩展功能。
实际上,HTMLayout的子页面不但可以是div,还可以是iframe,用iframe就可以嵌入另外一个网页
看源码,指定url就可以了
例如范例里的代码
<div class="panel" name="panel3">
这是第三个选项页,其中name属性指定选项卡名字
</div>
你可以改为
<iframe class="panel" name="panel3" src="/layout/a.aardio"/>
上面两楼只是总结于aar群聊。没有经过实际使用。
今天偶然需要这样用一下,从新整理了并自己码了下代码,熟悉了很多。
import win.ui; /*DSG{{*/ mainForm = win.form(text="aardio工程15";right=959;bottom=591) mainForm.add() /*}}*/ import web.layout; var wbLayout = web.layout( mainForm ); //自定义一个准备执行的behavior行为,如mycustomE namespace web.layout.behavior.mycustomE { //节点被创建的时候执行以下操作 onElementControlCreated = function (ltTarget,ltOwner,reason,behaviorParams) { //取得这个节点是谁的控件(示例取得的是mainform.custom) var ltCtrl = ltOwner.getCtrl(); //动态取得css里面自定义的一个名字叫formPath的静态变量值 var homepage = ltOwner.getCustomAttribute("formPath"); if( homepage ) //下面的就相当于mainform.custom.loadform()了 ltCtrl.loadForm(homepage); } } //要想内嵌winfrom里面的控件,就必须写cls属性,这个属性就是内嵌控件的类名, //还要定义html这个节点的名字,比如下面的mycustom,以便后面css属性里指定 wbLayout.html =/*** <body> <widget cls="custom" #mycustom style="width:100%%;height:100%%;"></widget> </body> ***/ //css里面指定节点和需要的执行行为behavior,如上面定义的mycustomE wbLayout.css = /** body{ margin:20px; height:100%%; font:system; } #mycustom { behavior:"mycustomE"; -formPath:'/res/aaa.aardio'; } **/ mainForm.show(); return win.loopMessage();
以上,我准备在htmlayout界面上展示一个custom控件,这个控件加载的是aaa.aardio这个窗体。
所以,
1, 首先先自定义了一个mycustomE的行为behavior。这个里面当节点被创建的时候,执行相应的动作,这个动作即loadform一个窗体
2, 创建了一个html界面,界面里有一个widget元素(注意,最好是用这个元素创建),里面定义了css的类名和样式。
3, 编写css样式,并指定css类名和它要执行的行为behavior
这样当界面打开的时候,就会加载一个custom在htmlayout界面上了。
本来是准备利用htmlayout的手风琴效果来做一个闭合的界面。
但是修改了几次感觉总不是自己想要的效果。
代码先放到下面,以后在看
把预览示例里面的复制过来改了一点点
import win.ui; /*DSG{{*/ mainForm = win.form(text="aardio工程15";right=959;bottom=591) mainForm.add() /*}}*/ import web.layout; import web.layout.behavior.tabs; import web.layout.behavior.shellIcon; import web.layout.behavior.lightBoxDialog; import web.layout.behavior.collapsibleByIcon; import web.layout.behavior.grid; import web.layout.behavior.sortableGrid; import web.layout.behavior.scroller; import web.layout.behavior.dropdown; import web.layout.behavior.popup; import web.layout.behavior.expandableList; import web.layout.behavior.collapsibleList; import web.layout.behavior.sizer; import web.layout.behavior.gripper; import web.layout.behavior.splitter; var wbLayout = web.layout( mainForm ); //自定义一个准备执行的behavior行为,如mycustomE namespace web.layout.behavior.mycustomE { //节点被创建的时候执行以下操作 onElementControlCreated = function (ltTarget,ltOwner,reason,behaviorParams) { //取得这个节点是谁的控件(示例取得的是mainform.custom) var ltCtrl = ltOwner.getCtrl(); //动态取得css里面自定义的一个名字叫formPath的静态变量值 var homepage = ltOwner.getCustomAttribute("formPath"); if( homepage ) //下面的就相当于mainform.custom.loadform()了 ltCtrl.loadForm(homepage); } } //要想内嵌winfrom里面的控件,就必须写cls属性,这个属性就是内嵌控件的类名, //还要定义html这个节点的名字,比如下面的mycustom,以便后面css属性里指定 wbLayout.html =/*** <body> <ul id="thebar" name="sliding bar"> <li default> <div class="caption"><img src="images/4.gif"></div> <div class="content"> <widget cls="custom" #mycustom style="width:100%%;height:100%%;"></widget> </div> </li> <li> <div class="caption"><img src="images/2.gif"></div> <div class="content"> <widget cls="custom" #mycustom2 style="width:100%%;height:100%%;"></widget> </div> </li> </ul> </body> ***/ //css里面指定节点和需要的执行行为behavior,如上面定义的mycustomE wbLayout.css = /** body { width:100%; height:100%; } #mycustom { behavior:"mycustomE"; -formPath:'/res/aaa.aardio'; } #mycustom2 { behavior:"mycustomE"; -formPath:'/res/bbb.aardio'; } @const ANIMATION_STEP_MS: 8; #thebar { style-set: "h-animate-when-current"; // see below width:100%%; height:max-intrinsic; min-height:100%; margin:0; padding:0; border:0px solid #bdbccc; background-color: #fff; behavior:expandable-list; flow:horizontal; overflow-y:hidden; overflow-x:hidden; } #thebar > li { flow:horizontal; display:block; width:min-intrinsic; /* natural width */ background-color: #F4F3F9; height:100%; } #thebar > li > .caption { width:100px; height:100%%; vertical-align:middle; background-image:url(images/outlook/tab.png); background-repeat:expand stretch-left stretch-right stretch-middle; background-position:3px 3px 3px 3px; } #thebar > li:collapsed > .caption:hover { transition:blend; background-image:url(images/outlook/tab-hover.png); } #thebar > li:collapsed > .caption:active { background-image:url(theme:button-pressed); } #thebar > li:expanded > .caption { background-image:none; } #thebar > li > .content { vertical-align: middle; white-space: nowrap; height:100%%; } #thebar > li:expanded > .content { overflow:hidden; width:100%%; } @set h-animate-when-current { :root > li { width:min-intrinsic; } :root > li:current { width:100%%; /* whole idea - it takes all available space */ } :root > li > .content /* normally li > .content inside is collapsed */ { visibility:collapse; overflow-x:hidden; } :root > li:animating > .content, :root > li:expanded > .content { visibility:visible; width:100%%; } :root > li:collapsed { assigned!: self.start-animation(); animation-start!: self::width = 100%% ; animation-end!: self::width = null, // reset values used in animation self.child(2)::visibility = null, self.child(2)::opacity = null; animation-step!: self::width > 0%% ? ( delta = limit( self::width * 0.12, 1%%, 8%% ), self::width = self::width - delta, self::width < 15%% ? self.child(2)::visibility = "collapse" # self::width < 50%% ? self.child(2)::opacity = float(self::width) / 50.0, return @ANIMATION_STEP_MS ); } :root > li:expanded { assigned!: self.start-animation(); animation-start!: self::width = 1%% ; animation-end!: self::width = 100%% ; animation-step!: self::width < 100%% ? ( delta = limit( (100%% - self::width) * 0.12, 1%%, 8%% ), self::width = self::width + delta, return @ANIMATION_STEP_MS ); } } **/ mainForm.show(); return win.loopMessage();
登录后方可回帖
换成自定义控件,loadForm就可以了
谢谢,daheian