`

[转] 完美解决Panel设置了borderSkin后内容体与标题栏重叠的问题

    博客分类:
  • FLEX
阅读更多
[url]   http://blog.csdn.net/zlxluofeng/archive/2010/12/17/6081233.aspx[/url]

如果您做过Flex皮肤方面的工作,并且想自定义Panel及其子控件(TitleWindow、Alert)的皮肤,应该会碰到过在设置了Panel的borderSkin样式后,Panel中的内容体会与Panel的Header部分重叠的问题。初次遇到此问题的时候,我一时束手无策,只能找一种替代方式来暂时解决给Panel设置皮肤。最近再一次接触到Flex的皮肤,因为替代方案在更换皮肤时会对系统改动比较大,所以我觉得有必要更深入了解Flex皮肤与样式,看有没有更好的方式来解决我们遇到的问题,我研究了一下Flex SDK中定义皮肤的类以及Container组件,事实证明我是幸运的。





    borderSkin样式用来给Container组件设置四周的边框及背景,Panel的默认borderSkin是mx.skins.halo.PanelSkin,在PanelSkin中有一个对容器边缘有重要影响的属性borderMetrics,该属性用来指定容器四个边框的大小,该属性是实现了IRectangularBorder接口而来的(确切的说应该是IBorder,由于Container中使用的是IRectangularBorder接口,所以我们需要IRectangularBorder接口)。对于自定义皮肤,一般都是使用Flash工具制作的,其链接类是MovieClip的子类,并没有实现Flex中的IRectangularBorder接口,所以对于Container来说,获取不到borderMetrics属性,也就只能使用默认值,也就是四个边框的大小都是0。对于大多数Container的子类来说,边框为0基本没什么影响,但由于Panel的特殊性——Panel多了标题栏,如果Panel的顶部边框为0的话,其内容体部分就会撑到最上面去,与Panel中定义的Header部分重叠起来。其实我们要解决的就是如何给自定义皮肤的Panel容器顶部边框指定一个大于0的值。

    对于皮肤的链接类从mx.skins.halo.PanelSkin继承,经测试是没办法编译通过的,因为Flash中链接类必须是MovieClip的子类;所以我尝试了另外一种方法,就是实现IRectangularBorder接口。在Flash中,对皮肤的链接类实现IRectangularBorder接口,但这种方式在项目中无法把皮肤的链接类对象转换为IRectangularBorder接口,可能是因为皮肤是在单独的swf中的缘故,没有与我们的Flex项目在同一个域中;我尝试的第三种方式也是实现IRectangularBorder接口,只是在Flex项目新建了一个容器类,然后把Flash中的Panel皮肤实例化并放到新建的容器类中,把该容器作为Panel的新皮肤类,终于可以解决Panel的内容与标题栏重叠的情况了,下面是效果图和一些代码:





下面是在Flex项目中实现的皮肤类,该类实现了IRectangularBorder接口的borderMetrics属性,并指定了该属性的top值。

package 

    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.geom.Rectangle; 
     
    import mx.containers.Panel; 
    import mx.core.EdgeMetrics; 
    import mx.core.IRectangularBorder; 
 
    public class Panel_XSMSkin extends Sprite implements IRectangularBorder 
    { 
        /**
        * Flash设计的Panel皮肤链接类
        */       
        [Embed(source="yflexskin.swf", symbol="Panel_borderSkin")] 
        public var PanelSkinClass:Class; 
         
        protected var skin:DisplayObject; 
         
        /**
         * 容器的边框大小属性 
         */      
        private var _bm:EdgeMetrics; 
         
        public function Panel_XSMSkin() 
        { 
            super(); 
            if(PanelSkinClass) 
            { 
                // 创建皮肤,并加入到此实现类中 
                skin = new PanelSkinClass(); 
                this.addChild(skin); 
            } 
        } 
         
        // IRectangularBorder 接口的方法,可不实现 
        public function get backgroundImageBounds():Rectangle 
        { 
            return null; 
        } 
        public function set backgroundImageBounds(value:Rectangle):void 
        { 
        } 
        public function get hasBackgroundImage():Boolean 
        { 
            return false; 
        } 
        public function layoutBackgroundImage():void  
        { 
        } 
         
        /**
         * 此属性的值用来设置容器的边框大小
         * @return 
         * 
         */      
        public function get borderMetrics():EdgeMetrics 
        { 
            if(_bm == null) 
            { 
                // 这里的关键是实现此属性,并指定边框的大小,其中第二个属性是top值 
                _bm = new EdgeMetrics(10, 40, 10, 10); 
            } 
            return _bm; 
        } 
    } 


下面是CSS中Panel的设置

Panel 

    closeButtonDisabledSkin: Embed(source="yflexskin.swf",symbol="Panel_closeButtonDisabledSkin"); 
    closeButtonDownSkin: Embed(source="yflexskin.swf",symbol="Panel_closeButtonDownSkin"); 
    closeButtonOverSkin: Embed(source="yflexskin.swf",symbol="Panel_closeButtonOverSkin"); 
    closeButtonUpSkin: Embed(source="yflexskin.swf",symbol="Panel_closeButtonUpSkin"); 
    /*
    Removed due to incompatibilities with Flex 3
    borderSkin: Embed(source="yflexskin.swf", symbol="Panel_borderSkin");
    */ 
    borderSkin: Embed(skinClass="Panel_XSMSkin"); 
 
    drop-shadow-enabled: false; 


CSS中注释的部分是没有封装皮肤链接类时设置的样式,在该样式下,内容体会与标题栏重叠,而未注释的borderSkin用来解决这个问题。

该测试项目可以通过下面的链接地址下载

    对于上面这种方式也并不是没有缺陷,因为没有从Flex皮肤的基类Border中继承,无法通过CSS来设置Panel的部分样式,当然对于自定义皮肤,基本上也不需要设置这些样式了。

    这个Panel皮肤的问题同样适用于TitleWindow和Alert,在研究这块的过程中,我尝试了多种方式,目前只找到上述这一种方式能行的通,如果您有更好的方式,还请指定一下哈,也希望与您探讨这个问题。
  • 大小: 9.2 KB
  • 大小: 10.2 KB
分享到:
评论

相关推荐

    Flex中Panel组件的borderSkin测试程序

    该测试程序是用来测试Flex中Panel组件设置了borderSkin后,内容体和标题栏重叠的问题,并给出了解决方式。

    Labview自定义标题栏并透明化界面

    要自定义标题栏,我们需要利用LabVIEW的面板(Panel)和控件(Control)功能。你可以创建一个新的面板,将其设置为顶部位置,并在其中添加你需要的控件,比如自定义的标题文本、图标或操作按钮。这些控件可以通过...

    C#中winform中panel重叠无法显示问题的解决

    然而,在设计界面时,如果多个Panel控件重叠,可能会导致某些Panel的内容无法正常显示,给用户带来困扰。这个问题通常是由于控件的Z轴顺序(即层叠顺序)设置不当造成的。 在WinForm中,每个控件都有一个ZOrder,...

    可以设置透明度的Panel

    在标题"可以设置透明度的Panel"中提到的功能,指的是我们可以通过编程方式改变Panel的透明度,使得它在界面上呈现出不同程度的透明或半透明效果。这种特性在设计美观且交互丰富的用户界面时非常有用。 首先,让我们...

    C# winform 透明Panel

    在C# WinForm开发中,有时我们希望创建一些具有特殊视觉效果的用户界面,比如透明的Panel控件。Panel控件通常用于组合其他控件,但默认情况下它是不透明的。要实现透明Panel,我们需要深入理解Windows窗体的绘图机制...

    dev设置皮肤,字体,折叠菜单,伸缩Panel实现

    同时,页面内容可能分布在几个伸缩Panel中,用户可以根据需要调整各个部分的显示。 在名为“demo008”的示例中,很可能是包含了实现这些功能的代码或HTML模板。分析和学习这个示例可以帮助你更好地理解如何在自己的...

    不用标题栏就可实现Delphi窗口拖动..rar

    1. **设置窗体属性**:首先,我们需要禁用窗体的标准标题栏,这可以通过在Form创建时设置`BorderStyle`属性为`bsNone`来实现。 ```delphi procedure TForm1.FormCreate(Sender: TObject); begin BorderStyle := ...

    winform自定义透明背景的panel控件

    在本案例中,我们将探讨如何利用C#编程语言自定义一个透明背景的Panel控件,这将使我们能够在不遮挡底层控件的情况下在其上进行绘图或处理点击事件。 首先,我们需要了解Windows Forms中的透明度概念。在.NET ...

    Delphi Xe2应用皮肤后Label字体颜色无法改变问题

    "Delphi Xe2应用皮肤后Label字体颜色无法改变问题"是一个常见的困扰开发者的技术难题。通常,第三方皮肤库会在底层接管控件的绘制,包括字体颜色,导致开发者无法通过标准的属性设置来改变字体颜色。在这种情况下,...

    Demo1-2-多个panel的显示问题

    标题 "Demo1-2-多个panel的显示问题" 指涉的是一个关于C# Winform应用程序中多个Panel控件的布局或显示异常的问题。在Winform开发中,Panel控件通常用于创建区域或者容器,以便更好地组织和管理其他控件。在描述中...

    c#自定义圆角panel

    至于文件中的"ControlPanel.dll",这是一个编译后的动态链接库(DLL)文件,其中包含了上述自定义控件的实现。开发者可以直接引用此DLL文件,在自己的项目中使用CustomRoundedPanel控件,而无需查看或修改源代码。 ...

    Win10窗口标题栏高度及滚动条宽度怎么设置.docx

    因此,如果你觉得默认的标题栏高度和滚动条宽度适合你,或者修改后影响了使用体验,你可以随时恢复到默认设置,只需将上述键值改回原来的数值,或者删除备份的注册表文件后重启电脑。 总的来说,通过自定义Windows ...

    delphi无标题窗体移动(panel覆盖情况)

    为了解决这个问题,我们可以将Panel的`MouseTransparent`属性设置为True,这样即使鼠标在Panel上,窗体仍然可以响应鼠标事件。或者,我们可以在Panel的OnMouseDown事件中将鼠标事件传递给窗体,让窗体可以移动。 ...

    c# panel的拖动和缩放

    2. 设置`Panel`的基本属性,如大小、位置、背景色等。 3. 将`Panel`添加到父容器(如`Form`)的控件集合中。 例如: ```csharp Panel newPanel = new Panel(); newPanel.Size = new Size(200, 200); newPanel....

    125%缩放非系统软件字体模糊怎么办 软件字体模糊解决方法.docx

    在以前的 Windows 系统版本中,125% 的 DPI 下,系统不会对软件的显示举行强制的缩放,只是转变了一些度量值,例如增大菜单、工具栏、标题栏的大小,增强字号等,不会导致软件含糊、界面显示不全的问题。 但是,在 ...

    winform 窗体打印panel

    创建一个`PrintDocument`实例,然后设置其`PrintPage`事件,这个事件会在实际打印时触发,我们可以在这个事件处理器中绘制`Panel`上的内容。 ```csharp private PrintDocument printDoc = new PrintDocument(); ...

    弧形圆角的panel

    为了解决这个问题,可以考虑使用Anchor属性或者FlowLayoutPanel、TableLayoutPanel等布局控件来合理布置顶层控件,确保它们不会完全覆盖Panel的边框。 在WinForm应用中,了解和掌握控件的布局和绘制机制至关重要。...

    panel颜色问题

    在这个特定的场景中,"panel颜色问题"可能指的是在编程或设计过程中遇到的与`Panel`组件背景色、边框色或字体颜色相关的技术挑战。下面我们将深入探讨`Panel`的颜色管理以及可能遇到的问题和解决方案。 1. **颜色...

    C# WinForm窗体控件Panel修改边框颜色以及边框宽度方法

    在C# WinForm开发中,Panel控件是一个非常常用的组件,它可以用来组织其他控件或者作为容器使用。本文将深入探讨如何修改Panel控件的边框颜色和边框宽度,以实现自定义的视觉效果。 首先,我们需要了解Panel控件的...

Global site tag (gtag.js) - Google Analytics