2011-08-18 39 views
6

我已經使用Spark面板顯示容器內的對象。面板和內部元素是動態創建的。 (使用ActionScript)。我需要在actionscript中刪除面板的標題欄。當我試圖刪除它時,我無法隱藏它。Flex 4 Spark組件面板 - 隱藏標題欄

試過下面的方法。

  1. 用過的風格(classname)和集合headerheight = 0

  2. 覆蓋面板組件並使用屬性this.titleBar.visible = false

但是無法隱藏標題欄。

我已經使用Panel Spark組件和Flash Builder 4.5進行開發。

如果還有其他方法可以實現這一點,請告訴我。

+1

只需創建一個沒有標題欄的皮膚。面板沒有任何所需的SkinParts – RIAstar

回答

5

最好的辦法是創建一個自定義皮膚,並從皮膚移動標題欄。把樣品放在一起很快。

這是您的自定義皮膚;將其作爲PanelSkin的副本創建,並將視覺元素註釋掉。

<?xml version="1.0" encoding="utf-8"?> 

<!-- 

ADOBE SYSTEMS INCORPORATED 
Copyright 2008 Adobe Systems Incorporated 
All Rights Reserved. 

NOTICE: Adobe permits you to use, modify, and distribute this file 
in accordance with the terms of the license agreement accompanying it. 

--> 

<!--- The default skin class for a Spark Panel container. 

    @see spark.components.Panel 

    @langversion 3.0 
    @playerversion Flash 10 
    @playerversion AIR 1.5 
    @productversion Flex 4 
--> 
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:fb="http://ns.adobe.com/flashbuilder/2009" blendMode="normal" mouseEnabled="false" 
    minWidth="131" minHeight="127" alpha.disabled="0.5" alpha.disabledWithControlBar="0.5"> 

    <fx:Metadata> 
     <![CDATA[ 
     /** 
     * @copy spark.skins.spark.ApplicationSkin#hostComponent 
     */ 
     [HostComponent("spark.components.Panel")] 
     ]]> 
    </fx:Metadata> 

    <fx:Script fb:purpose="styling"> 
     <![CDATA[ 
     import mx.core.FlexVersion; 

     /* Define the skin elements that should not be colorized. 
     For panel, border and title background are skinned, but the content area, background, border, and title text are not. */ 
     static private const exclusions:Array = ["background", "titleDisplay", "contentGroup", "controlBarGroup", "border"]; 

     /* exclusions before Flex 4.5 for backwards-compatibility purposes */ 
     static private const exclusions_4_0:Array = ["background", "titleDisplay", "contentGroup", "controlBarGroup"]; 

     /** 
     * @private 
     */ 
     override public function get colorizeExclusions():Array 
     { 
      // Since border is styleable via borderColor, no need to allow chromeColor to affect 
      // the border. This is wrapped in a compatibility flag since this change was added 
      // in Flex 4.5 
      if (FlexVersion.compatibilityVersion < FlexVersion.VERSION_4_5) 
      { 
       return exclusions_4_0; 
      } 

      return exclusions; 
     } 

     /** 
     * @private 
     */ 
     override protected function initializationComplete():void 
     { 
      useChromeColor = true; 
      super.initializationComplete(); 
     } 

     /** 
     * @private 
     */ 
     override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void 
     { 
      if (getStyle("borderVisible") == true) 
      { 
       border.visible = true; 
       background.left = background.top = background.right = background.bottom = 1; 
       contents.left = contents.top = contents.right = contents.bottom = 1; 
      } 
      else 
      { 
       border.visible = false; 
       background.left = background.top = background.right = background.bottom = 0; 
       contents.left = contents.top = contents.right = contents.bottom = 0; 
      } 

      dropShadow.visible = getStyle("dropShadowVisible"); 

      var cr:Number = getStyle("cornerRadius"); 
      var withControls:Boolean = 
       (currentState == "disabledWithControlBar" || 
       currentState == "normalWithControlBar"); 

      if (cornerRadius != cr) 
      { 
       cornerRadius = cr; 

       dropShadow.tlRadius = cornerRadius; 
       dropShadow.trRadius = cornerRadius; 
       dropShadow.blRadius = withControls ? cornerRadius : 0; 
       dropShadow.brRadius = withControls ? cornerRadius : 0; 

       setPartCornerRadii(topMaskRect, withControls); 
       setPartCornerRadii(border, withControls); 
       setPartCornerRadii(background, withControls);     
      } 

      if (bottomMaskRect) setPartCornerRadii(bottomMaskRect, withControls); 

      borderStroke.color = getStyle("borderColor"); 
      borderStroke.alpha = getStyle("borderAlpha"); 
      backgroundFill.color = getStyle("backgroundColor"); 
      backgroundFill.alpha = getStyle("backgroundAlpha"); 

      super.updateDisplayList(unscaledWidth, unscaledHeight); 
     } 

     /** 
     * @private 
     */ 
     private function setPartCornerRadii(target:Rect, includeBottom:Boolean):void 
     {    
      target.topLeftRadiusX = cornerRadius; 
      target.topRightRadiusX = cornerRadius; 
      target.bottomLeftRadiusX = includeBottom ? cornerRadius : 0; 
      target.bottomRightRadiusX = includeBottom ? cornerRadius : 0; 
     } 

     private var cornerRadius:Number; 
     ]]> 
    </fx:Script> 

    <s:states> 
     <s:State name="normal" /> 
     <s:State name="disabled" /> 
     <s:State name="normalWithControlBar" stateGroups="withControls" /> 
     <s:State name="disabledWithControlBar" stateGroups="withControls" /> 
    </s:states> 

    <!-- drop shadow can't be hittable so it stays sibling of other graphics --> 
    <!--- @private --> 
    <s:RectangularDropShadow id="dropShadow" blurX="20" blurY="20" alpha="0.32" distance="11" 
          angle="90" color="#000000" left="0" top="0" right="0" bottom="0"/> 

    <!-- drop shadow can't be hittable so all other graphics go in this group --> 
    <s:Group left="0" right="0" top="0" bottom="0"> 

     <!-- top group mask --> 
     <!--- @private --> 
     <s:Group left="1" top="1" right="1" bottom="1" id="topGroupMask" > 
      <!--- @private --> 
      <s:Rect id="topMaskRect" left="0" top="0" right="0" bottom="0"> 
       <s:fill> 
        <s:SolidColor alpha="0"/> 
       </s:fill> 
      </s:Rect> 
     </s:Group> 

     <!-- bottom group mask --> 
     <!--- @private --> 
     <s:Group left="1" top="1" right="1" bottom="1" id="bottomGroupMask" 
       includeIn="normalWithControlBar, disabledWithControlBar"> 
      <!--- @private --> 
      <s:Rect id="bottomMaskRect" left="0" top="0" right="0" bottom="0"> 
       <s:fill> 
        <s:SolidColor alpha="0"/> 
       </s:fill> 
      </s:Rect> 
     </s:Group> 

     <!-- layer 1: border --> 
     <!--- @private --> 
     <s:Rect id="border" left="0" right="0" top="0" bottom="0" > 
      <s:stroke> 
       <!--- @private --> 
       <s:SolidColorStroke id="borderStroke" weight="1" /> 
      </s:stroke> 
     </s:Rect> 

     <!-- layer 2: background fill --> 
     <!--- Defines the appearance of the PanelSkin class's background. --> 
     <s:Rect id="background" left="1" top="1" right="1" bottom="1"> 
      <s:fill> 
       <!--- @private 
         Defines the PanelSkin class's background fill. The default color is 0xFFFFFF. --> 
       <s:SolidColor id="backgroundFill" color="#FFFFFF"/> 
      </s:fill> 
     </s:Rect> 

     <!-- layer 3: contents --> 
     <!--- Contains the vertical stack of titlebar content and controlbar. --> 
     <s:Group left="1" right="1" top="1" bottom="1" id="contents"> 
      <s:layout> 
       <s:VerticalLayout gap="0" horizontalAlign="justify" /> 
      </s:layout> 

      <!--- @private --> 
<!--   <s:Group id="topGroup" mask="{topGroupMask}"> 
-->     
       <!-- layer 0: title bar fill --> 
       <!--- @private --> 
<!--    <s:Rect id="tbFill" left="0" right="0" top="0" bottom="1"> 
        <s:fill> 
         <s:LinearGradient rotation="90"> 
          <s:GradientEntry color="0xE2E2E2" /> 
          <s:GradientEntry color="0xD9D9D9" /> 
         </s:LinearGradient> 
        </s:fill> 
       </s:Rect> 
-->     
       <!-- layer 1: title bar highlight --> 
       <!--- @private --> 
<!--    <s:Rect id="tbHilite" left="0" right="0" top="0" bottom="0"> 
        <s:stroke> 
         <s:LinearGradientStroke rotation="90" weight="1"> 
          <s:GradientEntry color="0xEAEAEA" /> 
          <s:GradientEntry color="0xD9D9D9" /> 
         </s:LinearGradientStroke> 
        </s:stroke> 
       </s:Rect> 
-->     
       <!-- layer 2: title bar divider --> 
       <!--- @private --> 
<!--    <s:Rect id="tbDiv" left="0" right="0" height="1" bottom="0"> 
        <s:fill> 
         <s:SolidColor color="0xC0C0C0" /> 
        </s:fill> 
       </s:Rect> 
-->     
       <!-- layer 3: text --> 
       <!--- @copy spark.components.Panel#titleDisplay --> 
<!--    <s:Label id="titleDisplay" maxDisplayedLines="1" 
         left="9" right="3" top="1" bottom="0" minHeight="30" 
         verticalAlign="middle" textAlign="start" fontWeight="bold"> 
       </s:Label> 
--> 
<!--   </s:Group> 
-->    
      <!-- 
       Note: setting the minimum size to 0 here so that changes to the host component's 
       size will not be thwarted by this skin part's minimum size. This is a compromise, 
       more about it here: http://bugs.adobe.com/jira/browse/SDK-21143 
      --> 
      <!--- @copy spark.components.SkinnableContainer#contentGroup --> 
      <s:Group id="contentGroup" width="100%" height="100%" minWidth="0" minHeight="0"> 
      </s:Group> 

      <!--- @private --> 
      <s:Group id="bottomGroup" minWidth="0" minHeight="0" 
        includeIn="normalWithControlBar, disabledWithControlBar" > 

       <s:Group left="0" right="0" top="0" bottom="0" mask="{bottomGroupMask}"> 

        <!-- layer 0: control bar divider line --> 
        <s:Rect left="0" right="0" top="0" height="1" alpha="0.22"> 
         <s:fill> 
          <s:SolidColor color="0x000000" /> 
         </s:fill> 
        </s:Rect> 

        <!-- layer 1: control bar highlight --> 
        <s:Rect left="0" right="0" top="1" bottom="0"> 
         <s:stroke> 
          <s:LinearGradientStroke rotation="90" weight="1"> 
           <s:GradientEntry color="0xE5E5E5" /> 
           <s:GradientEntry color="0xD8D8D8" /> 
          </s:LinearGradientStroke> 
         </s:stroke> 
        </s:Rect> 

        <!-- layer 2: control bar fill --> 
        <s:Rect left="1" right="1" top="2" bottom="1"> 
         <s:fill> 
          <s:LinearGradient rotation="90"> 
           <s:GradientEntry color="0xDADADA" /> 
           <s:GradientEntry color="0xC5C5C5" /> 
          </s:LinearGradient> 
         </s:fill> 
        </s:Rect> 
       </s:Group> 
       <!-- layer 3: control bar --> 
       <!--- @copy spark.components.Panel#controlBarGroup --> 
       <s:Group id="controlBarGroup" left="0" right="0" top="1" bottom="1" minWidth="0" minHeight="0"> 
        <s:layout> 
         <s:HorizontalLayout paddingLeft="10" paddingRight="10" paddingTop="7" paddingBottom="7" gap="10" /> 
        </s:layout> 
       </s:Group> 
      </s:Group> 
     </s:Group> 
    </s:Group> 
</s:SparkSkin> 

這是該應用:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx"> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 

    <s:VGroup> 
     <s:Panel /> 
     <s:Panel skinClass="PanelNoTitleBar"/> 
    </s:VGroup> 

</s:WindowedApplication> 

第一面板將顯示原始的皮膚;第二個面板顯示自定義皮膚;沒有標題欄。

+0

感謝您的代碼。它工作正常。 – Srinivasan

+0

很好的回答。非常感謝! – Assaf

0

蒙皮是常見的建議,顯然這是預期的設計。其他答案在展示這種方法方面做得很好。

但是,在相關問題上也有一個很好的子類解決方案:Flex 4 spark Panel has an ugly gray top part。如果您只想刪除標題欄,這可能就足夠了。