模板实例化事件

XLUE164版本的模板新增了两个关于模板实例化的事件:

Ret, handled,callNext OnPreCreateInstance(template, userdata)

该事件在模板被实例化之前触发,假如此时需要动态修改模板,那么可以响应这个事件,然后利用模板对象(template参数)来修改并保存,

那么接下来的实例化,会利用修改后的模板来创建

Ret, handled,callNext OnPostCreateInstance(template, obj, userdata)

该事件在模板被实例化之后触发,其中obj参数指定了该模板新实例化出来的object对象,obj的类型根据模板的类型不同而不同,具体的来说

l  objecttemplate模板,那么obj是对应的LayoutObject类型,比如ImageObjectTextureObject或者用户自定义control

l  hostwndtemplate模板,那么obj是对应的hostwnd类型,比如FrameHostWndMenuHostWnd

l  animationtemplate模板,那么obj是对应的animation类型,比如PosChangeAnimation

l  objtreetemplate模板,那么objUIObjectTree类型

如果需要对模板实例化后的对象进行修改(修改属性或者挂接事件等等),可以响应这个事件,

然后利用实例对象(obj参数)来修改实例,这样修改的话,不会影响到模板本身,只对当前实例有效

上面两个事件当中,最后一个参数都是一个userdata,是为了方便使用而增设的,userdata需要在使用某个模板实例化对象(CreateInstance)时候,根据需要传入,

可以是任何lua支持的数据类型(包括函数,表等),下面会有详细的例子

模板事件可以在xml里面静态配置,也可以在拿到模板对象之后,动态的挂接上去:

l  静态配置

         <objtreetemplate  id="objtree" >

                  <attr>

                            。。。。。。

                  </attr>

        

                  <templateeventlist>

                            <event name="OnPreCreateInstance">

                            </event>

                  

                            <event name="OnPostCreateInstance">

                            </event>

                  </templateeventlist>

         </ objtreetemplate >

 

         也就是模板节点下面,增加了一个templateeventlist节点,所有关于模板的事件都会添加到这个节点下面(目前只有上述两个事件)

         这里需要注意的是,这个事件是跟模板对象相关系的,而和由模板实例化出来的对象没有关系

         objecttemplatehostwndtemplateanimationtemplateobjecttemplate四种模板的配置方式相同

 

         这里需要注意的是,假如模板有继承,那么templateeventlist也会受继承的影响,和eventlist节点的继承规则相同

 

l  动态挂接

 

local templateMananger = XLGetObject("Xunlei.UIEngine.TemplateManager")

local frameHostWndTemplate = templateMananger:GetTemplate("test.mainwnd","HostWndTemplate")

 

local function OnPreCreateInstance(template, userdata)

         ……

end

 

local cookie = frameHostWndTemplate:AttachListener(“OnPreCreateInstance”, true, OnPreCreateInstance)

。。。。。。

frameHostWndTemplate:RemoveListener(cookie)

 

挂接事件的方式和普通的object挂接事件的方式无甚区别,可以挂接一个或者多个事件

 

 

下面举例重点说明一下userdata的使用

比如我在xml里面配置了一个hostwnd模板,如下所示

<hostwndtemplate id="bolt.mainwnd" class="FrameHostWnd" >

                   <attr>

                            ……

                   </attr>

                   <eventlist>

                            ……

                   </eventlist>

                   <templateeventlist>

                            <event name="OnPreCreateInstance">

                                     local arg = {...}

                                     local userdata = arg[2]

                                     userdata()  --因为userdata是一个函数

                            </event>

                           

                            <event name="OnPostCreateInstance">

                                     XLMessageBox("OnPostCreateInstance")

                                     local arg = {...}

                                     XLMessageBox("templateid="..arg[1]:GetID()..",objid="..arg[2]:GetID())

                                    

                                     local userdata = arg[3]

                                     userdata() --因为userdata是一个函数

                            </event>

                   </templateeventlist>

</hostwndtemplate>      

        

其中在OnPreCreateInstanceOnPostCreateInstance 两个事件里面都使用了userdata,再看userdata的来源:

 

local templateMananger = XLGetObject("Xunlei.UIEngine.TemplateManager")

local frameHostWndTemplate = templateMananger:GetTemplate("bolt.mainwnd","HostWndTemplate")

local function OnCreateInstanceCallBack()

         XLMessageBox("OnCreateInstance CallBack")

end

        

local frameHostWnd = frameHostWndTemplate:CreateInstance("Bolt.MainFrame", nil, OnCreateInstanceCallBack)

 

userdata是在模板实例化的操作CreateInstance里面传入的,也就是第三个参数,前面两个参数分别对应对象的idpackagename

对于上面所述的四种模板,调用方式和参数是完全一致的。

这个参数可以不设置,默认为nil

 

另外模板新增加了GetIDGetPackageName方法,用来获取该模板的id和所在的xarid,如果需要了解模板修改、使用等关于模板的

更多内容,请参考之前的一份文档《模板指南》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值