Spiga

FloatingBehavior补遗:Location属性与move事件

2006-09-26 20:51 by Jeffrey Zhao, 1187 visits, 网摘, 编辑
  FloatingBehavior在官方文档中的例子似乎只有对其最简单使用方式的介绍,却没有对其Location属性和move事件的说明。虽然它们非常简单,我想可能还是需要了解一下的。FloatingBehavior的Class Library在本人前面的文章《补充部分官方文档里没有的Client Library以及代码提示Schema更新》中有说明。我们从一个简单的例子来看这两个成员:

  首先,我们定义一些CSS类:
<style>
    body 
{ font-family: Arial; font-size: 12px; }
    #handle 
{ background-color: #EEEEEE; }
    #floatDiv 
{ width: 100px; border: solid 1px black; height: 100px;}
    .red 
{color: red;}
</style>

  注意在使用FloatingBehavior时需要引入AtlasUIDragDrop这个Framework Script:
<atlas:ScriptManager ID="ScriptManager1" runat="server">
    
<Scripts>
        
<atlas:ScriptReference ScriptName="AtlasUIDragDrop" />
    
</Scripts>
</atlas:ScriptManager>

  然后是所需的HTML元素:
<div style="height:300px; border:solid 1px black;">
    
<div id="location">Drop to change color.</div>
    
<div id="floatDiv">
        
<div id="handle">Handle</div>
        
<div>blablabla</div>
    
</div>
</div>

  其中最外层的高300px的容器,这个是拖动的有效区域。只有在页面范围内的拖动才会有效,这也就是为什么有朋友会遇到在自己的例子中拖动后会回到原处的情况,这是因为简单的例子页面区域就是很小的一块,所以被拖动的元素无法停留。

  接下来就是最重要的Atlas Script了:
<script type="text/xml-script">
    
<page xmlns:script="http://schemas.microsoft.com/xml-script/2005">
        
<components>
            
<label id="location">
                
<bindings>
                    
<binding dataContext="floating" dataPath="location" property="text" />
                
</bindings>
            
</label>
            
<control id="floatDiv">
                
<behaviors>
                    
<floatingBehavior id="floating" handle="handle" location="100, 50">
                        
<move>
                            
<invokeMethod target="location" method="toggleCssClass">
                                
<parameters className="red" />
                            
</invokeMethod>
                        
</move>
                    
</floatingBehavior>
                
</behaviors>
            
</control>
        
</components>
    
</page>
</script>

  FloatingBehavior的move事件会在浮动元素落在有效范围内(上面的例子里则是最外层高300px的div)触发,触发时id为location的div的前景色会在红与白之间切换。而FloatingBehavior的Location属性以字符串“x, y”形式设定了浮动元素的坐标,在set_Location内部Behavior会调用Sys.UI.Control.setLocation“静态”方法来设置浮动元素的位置。自然,我们能通过binding来访问这个属性,可以看到在id为location的div里会根据当前behavior的location当前值而改变。如果将浮动元素拖动至有效范围外的话,那么它就会回到原处,move事件也不会触发。

  很自然,move事件除了使用Xml Element形式调用Action之外,也能以填写Xml Attribute来调用javascript方法。先修改上面一行Atlas Script代码以Xml Attribute方法调用comfirmDrop函数:
<floatingBehavior id="floating" handle="handle" location="100, 50" move="confirmDrop">
    ...
</floatingBehavior>

  再增加一个javascript函数:
<script language="javascript">
    
function confirmDrop(sender, args)
    {
        
var msg = "Do you really want to drop the control at " + sender.get_location() + "?";
        
if (!confirm(msg))
        {
            args.set_canceled(
true);
        }
    }
</script>

  在这里,sender就是那个当前的FloatingBehavior对象,而args就是大名鼎鼎的Sys.CancelEventArgs!因此我们能够相当方便的使用args.set_canceled(true)来取消这次移动。在示范中也可以很方便的看出,如果用户在Confirm Dialog中选择了“Cancel”,那么漂浮的控件就会回到原处。

  这个就是对FloatingBehavior的Location属性和move事件的介绍,可以看出,有了binding,Declarative Syntax本身又是多么的优雅。有了Atlas,编写javascript代码有多么的轻松。

  本文所用例子的源代码,可以点击这里下载。如果您希望查看效果,请点击这里

Add your comment

14 条回复

  1. #1楼 戴南      2006-09-28 17:09
    收藏 支持!~
      回复  引用  查看    
  2. #2楼[楼主] Jeffrey Zhao      2006-09-28 17:27
    @戴南
    多谢支持。:)
      回复  引用  查看    
  3. #3楼[楼主] Jeffrey Zhao      2006-10-02 22:13
    嗯,看了Type.Event代码以后才意识到,Cancel后Action还是执行,和BeforeHandler还是AfterHandler无关……
      回复  引用  查看    
  4. #4楼 蛙蛙池塘      2006-12-02 23:19
    这是拖动效果吧,好像rico里也有这功能,你能不能给整一份ajax客户端功能和服务端功能的一个列表呀。
      回复  引用  查看    
  5. #5楼[楼主] Jeffrey Zhao      2006-12-02 23:24
    @蛙蛙池塘
    大哥,您可以放弃阅读CTP的东西了……
      回复  引用  查看    
  6. #6楼 Shawn[匿名][未注册用户]2006-12-11 23:46
    这段代码改到Beta2里面应该是什么样子的?
    在Beta2的环境下按照你的文章做Demo,发现会报错,已经增加了
    <Scripts>
    <asp:ScriptReference Assembly="Microsoft.Web.Preview" Name="Microsoft.Web.Resources.ScriptLibrary.PreviewScript.js" />
    <asp:ScriptReference Assembly="Microsoft.Web.Preview" Name="Microsoft.Web.Resources.ScriptLibrary.PreviewGlitz.js" />
    <asp:ScriptReference Assembly="Microsoft.Web.Preview" Name="Microsoft.Web.Resources.ScriptLibrary.PreviewDragDrop.js" />
    </Scripts>

    但是xml-script不知道怎么改了
      回复  引用    
  7. #7楼[楼主] Jeffrey Zhao      2006-12-12 00:34
    @Shawn[匿名]
    您可以查阅Whitepaper的相关章节,说的还是很清楚的。
    如果还有什么问题的话,我再帮您详细解答一下。:)
      回复  引用  查看    
  8. #8楼 Shawn[匿名][未注册用户]2006-12-12 11:40
    老赵,不好意思还是要麻烦你,我还是没搞定。
    问题出在<move>
    <invokeMethod target="location" method="toggleCssClass">
    <parameters className="red" />
    </invokeMethod>
    </move>
    这里,去掉这段就没问题了,但是移动时css就不会变了;
    confirmDrop这个方法也会报错提示“对象不支持此属性或者方法”;
    “其中最外层的高300px的容器,这个是拖动的有效区域。只有在页面范围内的拖动才会有效,这也就是为什么有朋友会遇到在自己的例子中拖动后会回到原处的情况,这是因为简单的例子页面区域就是很小的一块,所以被拖动的元素无法停留。”这里我在demo中发现好像Beta2没有这样的限制了,元素可以被随意拖动到页面的任意位置,我是按照你的代码写的,不知道问题出在哪里了?;
    还有如果想在层拖动时或拖动结束时做些自己写的逻辑动作,是不是要使用DragMananger的Dragstart和Dragend方法啊?该如何使用啊?
      回复  引用    
  9. #9楼[楼主] Jeffrey Zhao      2006-12-12 17:41
    @Shawn[匿名]
    您看一下label是不是还有toggleCssClass方法了呢?可能被取消了。
    至于拖动是的限制,我想应该还是有的,因为这是浏览器的特性,您的body是不是已经占了比较大的空间了呢?
    至于在拖动时和拖动结束后,我没有尝试过,不过我想您的思路应该是正确的。
    // 说实话,我对于Feture-add的功能已经很久没有接触过了……:(
      回复  引用  查看    
  10. #10楼 Shawn[匿名][未注册用户]2006-12-12 17:53
    我想问一下,Feture-add这部分在正式版release之后会被移动到正式版里面还是又会发生很大变动?

    从你的blog中学到了太多的东西,十分感谢。
    继续努力啊,期待能一直看到你的文章。
      回复  引用    
  11. #11楼[楼主] Jeffrey Zhao      2006-12-12 18:00
    @Shawn[匿名]
    我认为它们会被维持现状。从CTP到Beta1来看,ASP.NET AJAX作的完全可以说是服务器端的增强和客户端基础架构(异步传输,类型系统等等),而把CTP原有的一些比较“花哨”的功能转移到了Value-Add包内。而从Beta1到Beta2来看,除了Value-add改名为Feature-add之外它们没有任何改动,因此我想它们应该不太会有很大变动了吧,这也是我觉来越少接触Feature-add的原因。而Feature-add里最主要的功能,xml-script的地位也变得很尴尬,因为在ASP.NET AJAX里的$create等已经让xml-script像是鸡肋一般的东西了,而且还要引入一个不算小的Feature-add包。像ASP.NET AJAX Control Toolkit生成的代码也已经完全依靠$create,感觉似乎ASP.NET AJAX的设计思路已经放弃了xml-script了……
      回复  引用  查看    
  12. #12楼[楼主] Jeffrey Zhao      2006-12-12 18:02
    @Shawn[匿名]
    忘了说了,目前我注意力放在.NET 3.0和WPF/E上,ASP.NET AJAX准备在正式版出来之后继续写。:)
    多谢支持阿!
      回复  引用  查看    
  13. #13楼 Shawn[匿名][未注册用户]2006-12-12 23:14
    呵呵,老赵,不好意思啊,这篇还有点问题想请教你
    <script language="javascript">
    function confirmDrop(sender, args)
    {
    var msg = "Do you really want to drop the control at " + sender.get_location() + "?";
    if (!confirm(msg))
    {
    args.set_canceled(true);//Beta2下变成了args.set_cancel(true);
    }
    }
    </script>

    问题是:move有args参数,但是dragstart和dragend的事件中怎么没有args参数呢?我看了PreviewDragDrop.js中关于FloatingBehavior的定义却怎么也找不到move事件的定义,但是代码中却可以用?
    还有一个关于AjaxControlToolkit的小问题,可以直接使用AjaxControlToolkit中的Behavior吗?具体场景是这样,我现在用$create(Sys.Preview.UI.FloatingBehavior, {'handle': ctrlHandle}, {"move":confirmDrop}, null, ctrl);语句动态的在js中给div层加上了拖动的效果,还想给这个层加上AjaxControlToolkit中ResizableControl的效果,我看了AjaxControlToolkit发现里面有ResizableControlBehavior,能不能用$create把resizable的效果也加到div上?我自己在ScriptReference引入了AjaxControlToolkit里面的这个js,但是却不能create出。这样做是否可行?
      回复  引用    
  14. #14楼[楼主] Jeffrey Zhao      2006-12-13 10:28
    有move事件的定义阿,就是add_move和remove_move方法,这是RTM的事件定义方法。我觉得如果您要响应被“拖动”的事件呢,可以尝试着扩展一下FloatingBehavior,而不是从DragDropManager入手比较好。因为DragDropManager是全局的,您要的的只是FloatingBehavior-Specific的事件。因为使用了prototype的方式,这种扩展还是比较容易的。在Event Handler里您可以通过$find来得到Behavior。
    这么做是可行的,如果有什么问题的话,应该还是操作上的问题。因为事实上您即使使用了Extender,其实也只是在客户端生成了$create方法的调用。:)
      回复  引用  查看    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 515541




相关文章:

相关链接: