Flex PropertyGrid实现

PropertyGrid在界面设计工具中是比较常用的组件,在.NET的WinForm设计中, PropertyGrid作为内置的组件来实现对 button、label等组件的属性设置,不仅满足了设计 时的需要,还能够在运行时提供美观实用的帮助;但是Flex作为目前界面设计展现方向上的 主流技术,并没有提供该组件。为了弥补这一不足,本文将介绍并实现Flex PropertyGrid组 件模型。

PropertyGrid模型可以分为两个部分,即行为模型和数据展现模型。

所谓的行为模型就是PropertyGrid所包含的事件及其在不同状态下的展示方式。事件部分 我们暂且只支持PropertyGrid的 selectedObjectChanged事件。展示方式主要是悬浮状态下 ,Mini选项卡开启,鼠标移到Mini选项卡的时候 PropertyGrid主面板弹出,鼠标移出 PropertyGrid时,PropertyGrid自动关闭,同时显示出Mini选项卡,;非悬浮状态下, PropertyGrid停靠在Container中,Mini选项卡关闭。

数据展现模型就是PropertyGrid所展示内容的元数据定义,用这些定义好的元数据标记数 据类型后,PropertyGrid可以自动的从数据类型实例中读取元数据定义,并根据类别、描述 等信息自动展示。

事件模型处理相关代码如下:

[Event (name="selectedObjectChanged",type="propertygrid.PropertyGridEvent")]
     [Event (name="floatStateChanged",type="propertygrid.PropertyGridEvent")];
     public class IPropertyGrid extends Canvas 
     {
         //是否悬浮 
         private var isFloat:Boolean=false;
         //悬浮状态需要的mini属性卡 
         private var miniPropertyGird:Canvas=null;
         //当前选择对象
         private var selectedObject:Object=null;

         //属性窗口容器 
         public var container:DisplayObjectContainer=null;
         //属性窗口内容展示区 
         public var content:VBox=null;
         //悬浮状态切换图片 
         public var title_img_pin:Image=null;
         //最小化图片 
         public var title_img_min:Image=null;

         /**
          * 构造函数
          * */
         public function IPropertyGrid()
         {
             this.addEventListener (FlexEvent.CREATION_COMPLETE,init);
             this.addEventListener (PropertyGridEvent.FLOAT_STATE_CHANGED,floateStateChangedHandler);
         }

         /**
          * 悬浮状态切换的处理函数
          *
          * 逻辑:悬浮状态,从容器中移除属性窗口,将mini属性窗口增加 到容器中,同时为属性窗口增加Rollout处理函数
          *         内嵌状态,将属性窗口增加到容器,从容器中 mini属性窗口,移除属性窗口的Rollout处理函数
          * */
         public function floateStateChangedHandler (e:PropertyGridEvent):void
         {
             if(isFloat)
             {
                 this.container.removeChild(this);
                 this.container.addChild(miniPropertyGird);
                 this.addEventListener (MouseEvent.ROLL_OUT,mouseClosePropGrid);
             }
             else 
             {
                 this.container.addChild(this);
                 this.container.removeChild (miniPropertyGird);
                 this.removeEventListener (MouseEvent.ROLL_OUT,mouseClosePropGrid);
             }
         }

         /**
          * 获取当前选中对象
          * */
         public function get SelectedObj():Object
         {
             return this.selectedObject;
         }

         /**
          * 更改当前选中对象,并触发SELECTED_OBJECT_CHANGED事件
          * */
         public function set SelectedObj(obj:Object):void
         {
             if(this.selectedObject!=obj)
             {
                 this.selectedObject=obj;
                 dispatchEvent(new PropertyGridEvent (PropertyGridEvent.SELECTED_OBJECT_CHANGED));
             }
         }

         /**
          * 初始化函数
          * */
         public function init(e:FlexEvent):void
         {
             Assert.notNull(container,"container");
             Assert.notNull(content,"content");
             Assert.notNull(title_img_pin,"title_img_pin");
             Assert.notNull(title_img_min,"title_img_min");
             title_img_pin.addEventListener (MouseEvent.CLICK,changeFloatState);
             title_img_min.addEventListener (MouseEvent.CLICK,minPropertyGrid);
             initMiniPropertyGrid();
         }

         /**
          * 更改悬浮状态函数
          * */
         public function changeFloatState(e:MouseEvent):void
         {
             this.isFloat=!this.isFloat;
             dispatchEvent(new PropertyGridEvent (PropertyGridEvent.FLOAT_STATE_CHANGED));
         }

         /**
          * 悬浮状态下显示属性窗口函数
          * */
         public function showPropertyGrid(e:MouseEvent):void
         {
             var point:Point=new Point (container.x+container.width-this.width,container.y);
             var targetPoint:Point=container.localToGlobal (point);
             this.x=targetPoint.x;
             this.y=targetPoint.y;
             this.height=container.height;
             PopUpManager.addPopUp(this,container,false);
             var effect:WipeLeft=new WipeLeft();
             effect.duration=300;
             effect.target=this;
             effect.play();
         }

         /**
          * 初始化mini属性窗口
          * */
         public function initMiniPropertyGrid():void
         {
             miniPropertyGird=new Canvas();
             miniPropertyGird.height=100;
             miniPropertyGird.width=25;
             miniPropertyGird.setStyle("top",0);
             miniPropertyGird.setStyle("right",0);
             var img:Image=new Image();
             img.source="assets/propertygrid.png";
             img.percentHeight=100;
             img.percentWidth=100;
             img.addEventListener (MouseEvent.MOUSE_OVER,showPropertyGrid);

             miniPropertyGird.addChild(img);
         }

         /**
          * 最小化属性窗口函数
          * */
         public function minPropertyGrid(e:MouseEvent):void
         {
             PopUpManager.removePopUp(this);
         }

         /**
          * 关闭悬浮状态属性窗口处理函数
          * */
         public function mouseClosePropGrid(e:MouseEvent):void
         {
             var pg:IPropertyGrid=e.target as IPropertyGrid;
             if(pg!=null)
             {
                 PopUpManager.removePopUp(pg);
             }
         }

         /**
          * 增加属性窗口单元
          *
          * @param title:单元标题
          * */
         public function addGridUnit(title:String):GridUnit
         {
             var tgrid:GridUnit=new GridUnit();
             PopUpManager.addPopUp (tgrid,Application.application.document);
             tgrid.title_content.text=title;
             this.content.addChild(tgrid);
             return tgrid;
         }
     }

     /**
      * @desc:    属性窗口事件
      *     SELECTED_OBJECT_CHANGED    :    当前选中对象改变 时触发的事件
      *     FLOAT_STATE_CHANGED        :    悬浮状态发生 改变时触发的事件
      *
      * @author:    sunjingtao
      * */
     public class PropertyGridEvent extends Event
     {
         public static const  SELECTED_OBJECT_CHANGED:String="selectedObjectChanged";
         public static const  FLOAT_STATE_CHANGED:String="floatStateChanged";
         public function PropertyGridEvent(type:String,  bubbles:Boolean=false, cancelable:Boolean=false)
         {
             super(type, bubbles, cancelable);
         }

     }

时间: 2024-12-22 22:05:09

Flex PropertyGrid实现的相关文章

充分利用 .NET 框架的 PropertyGrid 控件(微软)之二

控件|微软 创建 PropertyGrid 控件要使用 Visual Studio .NET 创建 PropertyGrid 控件,需要将该控件添加到工具箱中,因为默认情况下并不包含该控件.在 Tools(工具)菜单中,选择 Customize Toolbox(自定义工具箱).在对话框中选择 Framework Components(框架组件)选项卡,然后选择 PropertyGrid. 如果您从命令行编译代码,请使用 /reference 选项并指定 System.Windows.Forms.

读取Flex AIR应用程序设置

说明: 本人之前做过一年的Flex AIR移动跨平台开发,在之前学习过程中,一直是将笔记记在了Evernote上,有的笔记是自己写的,也有的笔记是在网上看到,顺手记下了的. 所以在这里声明下,如果在网上看到类似的或者是一模一样的文章,请见谅. 因为找不到原文作者,所以,不在我的博客里说明是转载自哪里了,望原文作者见谅. 在运行时,您可以获取应用程序描述符文件的属性及应用程序的发行商 ID.它们是在 NativeApplication 对象的 applicationDescriptor 和 pub

C# 设计时动态改变实体在PropertyGrid中显示出来的属性

方法一: /// <summary> /// 实体属性处理 /// </summary> public class PropertyHandle { #region 反射控制只读.可见属性 //SetPropertyVisibility(obj, "名称 ", true); //obj指的就是你的SelectObject, "名称"是你SelectObject的一个属性 //当然,调用这两个方法后,重新SelectObject一下,就可以了.

ai 插件与flex界面-如何把adobe illustrutor 中的art对象得到缩略图并传到flex面版上绘出

问题描述 如何把adobe illustrutor 中的art对象得到缩略图并传到flex面版上绘出 最近,开发一个AI的插件,在AI的图片传到flex上卡住,望各位高手不吝赐教

Flex AIR Mobile应用性能解决方案

这个flex  mobile开发,一般原生开发也许是最合适的方式,但是涉及到跨平台的问题,有精力的团队一般都会逐个基于移动操作系统进行开发.但是如果追求短小,精悍,快速,希望能够跨平台,基于html5或者Flex开发是一个不错的选择. Flex是个双刃剑,用的好的,做出来的效果不比原生差,做的不好的,效果.性能则不敢恭维,关于如何使用Flex开发出性能较高的应用,通过验证后得以收纳如下:   1.组件尽量使用为移动开发优化的(Spark组件),皮肤尽量使用简洁的,一般最好通过graphic以及f

基于flex4技术从零开发flex博客系统:3 使用Remoting服务

在flex中有多种对象可用于与server交互,有URLLoader.HttpService.WebService.RemotingObject.Socket,NetConnection等: 1,URLLoader与HttpService多种于加载静态文本文件. 2,WebService基于soap协议,效率虽不及Remoting,但可移植性好,与平台.语言完全解藕. 3,Remoting采用amf通讯协议,通讯效率被认为是WebServive的10倍.目前已有多种成熟的服务端框架可供选用,.N

基于flex4技术从零开发flex博客系统:1 开发环境配置与hello world

一,如何学好flex 学习技术,最好的方法莫过于边学边用,一边阅读官方文档,一边在项目中实践.但是官方文档太过乏味:若是没人带,从头做项目又不知从何下手.若是有这么一个人,从他最初学习到最后学有所成,这个过程一一被记录下来,别人沿着他这个轨迹学习,一定会更容易入门. 对于初学者,学习内容若太难了,不易理解:若太容易了,又丧失了学习的兴趣与动力.cookbook居说很好,例子很丰富,无论什么问题都能找到答案.但CookBook只是只是针对简单.单一问题的解答集合,很松散,问题与问题之间没有联系,解

Flex Data Binding详解

Data BindIng简单的说就是当绑定源属性发生变化时,Flex 会把绑定源变化后属性的值赋给目的物的属性.做到了数据同步. Data BindIng 什么时候发生: 1.在绑定源属性值发生改变时发生. 2.在绑定源发出initialize事件时绑定发生一次. 让属性具有可绑定功能: 一般的,只要在属性前加上 [Bindable] 或 [Bindable(event="eventname")] 元标记即可 注意: 如果没有标出触发绑定的事件,正如[Bindable],Flex会自动

基于XML和JSON设计的Flex

本文很好的例举了如何将Flex 和Java一起使用.Java将运行这种服务.Flex将在客户端上运行.它们两者之间的协议可以真正的实现你想要的.既然这样,那么先使用XML,然后使用Javascript Object Notation (JSON),因为这两者都是我们最常见的Web 2.0标准 创建服务器区块 XML实例从表1中一个简单的JSP文档开始 Listing 1. xml.jsp ﹤jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"