【问题标题】:Spark TitleWindow's titlebar fontSize ChangeSpark Title Window 的标题栏字体大小变化
【发布时间】:2011-08-25 07:33:03
【问题描述】:

当我尝试更改 TitleWindows 标题栏的 fontSize 时,整个容器更改为新的字体大小。但我不想实现这一点。我只想在标题栏上得到它。

我用过的代码(不成功)

<s:TitleWindow name="MyTitleWindow"
        xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx"
        title="Search"
        width="1200"
        height="800"
        fontSize="24"
        preinitialize="preInit();"
        close="handleCloseEvent(event);" >

---
---
</s:TitleWindow>

我正在使用 Flex4 和 Spark。

【问题讨论】:

    标签: apache-flex flex4 customization flex-spark


    【解决方案1】:

    建议你根据spark.skins.spark.TitleWindowSkin创建自己的皮肤,将Label对应的属性改成idtitleDisplay

    你可以阅读更多关于皮肤的细节in official documentation

    您的窗口的示例皮肤如下(仅添加了一个属性):

    <?xml version="1.0" encoding="utf-8"?>
    <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="76" minHeight="76" alpha.disabled="0.5" alpha.disabledWithControlBar="0.5">
    
        <fx:Metadata>
            <![CDATA[ 
            /** 
             * @copy spark.skins.spark.ApplicationSkin#hostComponent
             */
            [HostComponent("spark.components.TitleWindow")]
            ]]>
        </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", "border"];
    
            /* exclusions before Flex 4.5 for backwards-compatibility purposes */
            static private const exclusions_4_0:Array = ["background", "titleDisplay", "contentGroup"];
    
            /**
             * @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" ||
                     currentState == "inactiveWithControlBar");
    
                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="inactive" stateGroups="inactiveGroup" />
            <s:State name="disabled" />
            <s:State name="normalWithControlBar" stateGroups="withControls" />
            <s:State name="inactiveWithControlBar" stateGroups="withControls, inactiveGroup" />
            <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" 
                                 alpha.inactiveGroup="0.22" distance="11"  distance.inactiveGroup="7"
                                 angle="90" color="0x000000" 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="withControls">
                <!--- @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>
                    <!--- Defines the TitleWindowSkin class's border stroke. The default value is 1. -->
                    <s:SolidColorStroke id="borderStroke" weight="1" />
                </s:stroke>
            </s:Rect>
    
            <!-- layer 2: background fill -->
            <!--- Defines the appearance of the TitleWindowSkin class's background. -->
            <s:Rect id="background" left="1" top="1" right="1" bottom="1">
                <s:fill>
                    <!--- Defines the TitleWindowSkin 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 title bar content and control bar. -->
            <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="0xD2D2D2"
                                                 color.inactiveGroup="0xEAEAEA"/>
                                <s:GradientEntry color="0x9A9A9A"
                                                 color.inactiveGroup="0xCECECE"/>
                            </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="0xE6E6E6" />
                                <s:GradientEntry color="0xFFFFFF" alpha="0.22"/>
                            </s:LinearGradientStroke>
                        </s:stroke>
                        <s:fill>
                            <s:LinearGradient rotation="90">
                                <s:GradientEntry color="0xFFFFFF" alpha="0.15" />
                                <s:GradientEntry color="0xFFFFFF" alpha="0.15" ratio="0.44"/>
                                <s:GradientEntry color="0xFFFFFF" alpha="0" ratio="0.4401"/>
                            </s:LinearGradient>
                        </s:fill>
                    </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="0x000000" alpha="0.75" />
                        </s:fill>
                    </s:Rect>
    
                    <!-- layer 3: text -->
                    <!--- @copy spark.components.Panel#titleDisplay -->
                    <s:Label id="titleDisplay" maxDisplayedLines="1"
                             left="9" right="36" top="1" bottom="0" minHeight="30"
                             verticalAlign="middle" fontWeight="bold" fontSize="20" />
    
                    <!-- layer 4: moveArea -->
                    <!--- @copy spark.components.TitleWindow#moveArea -->
                    <s:Group id="moveArea" left="0" right="0" top="0" bottom="0" />
    
                    <!--- @copy spark.components.TitleWindow#closeButton -->
                    <s:Button id="closeButton" skinClass="spark.skins.spark.TitleWindowCloseButtonSkin"
                              width="15" height="15" right="7" top="7" />
                </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="withControls">  
    
                    <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="0xFFFFFF" />
                                    <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="0xEDEDED"/>
                                    <s:GradientEntry color="0xCDCDCD"/>
                                </s:LinearGradient>
                            </s:fill>
                        </s:Rect>
                    </s:Group>
    
                    <!--- @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>
    

    您可以使用外部 CSS 文件或直接在 MXML 中应用它:

    <s:TitleWindow skinClass="MyTitleWindowSkin" />
    

    或者在 ActionScript 中:

    myWindow.setStyle("skinClass", MyTitleWindowSkin);
    

    【讨论】:

      【解决方案2】:

      我已经解决了上述问题

      <s:TitleWindow name="MyTitleWindow"
              xmlns:fx="http://ns.adobe.com/mxml/2009"
              xmlns:s="library://ns.adobe.com/flex/spark"
              xmlns:mx="library://ns.adobe.com/flex/mx"
              title="Search"
              width="600" height="800"
              creationComplete="complete();"  
              close="handleCloseEvent(event);">
      
      ----
      ----
      

      Actionscript 部分:

              private function complete():void {
                  trace("Style" + this.titleDisplay.getStyle("fontSize")); 
                  this.titleDisplay.setStyle("fontSize", "30");
              }
      

      这样我只能更改titleBar fontSize。

      希望它能帮助其他人。

      【讨论】:

      • -1 来自我。 Spark 架构遵循 MVC 原则,组件本身用于 M 和 C(所有逻辑和交互处理),皮肤用于 V。标题的字体大小与逻辑或交互无关。绝对是 View 并且 100% 应该在皮肤中实现。
      • @Constainer,作为Flex的初学者,我听不懂你想说什么。上面的代码有什么问题?
      • 此代码有效,但不是最佳实践。为什么您不想尝试专门用于通过设计更改可见表示的皮肤。皮肤是用于自定义的正确 Flex 4 方式。而且我还建议您阅读 MVC 模式,它不是 Flex 的东西,而是与一般软件开发相关的。使用它,您可以更好地设计您的应用程序,并且可以更好地理解 Spark 皮肤范例。
      • 非常感谢。我发现皮肤有点复杂。如何使用皮肤实现它?任何关于皮肤编程的简单介绍都可能帮助我实现我的目标。您的指导可能会帮助我更多地了解 Flex。
      • 我已在答案中添加了详细信息。
      猜你喜欢
      • 2012-03-26
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2016-05-30
      • 2015-12-09
      • 2013-04-18
      相关资源
      最近更新 更多