实际上,这不是唯一的方法,它是 - 正如你所提到的 - 硬编码的方式:对此感到抱歉。您还可以为 TitleWindow 组件设置皮肤以接受背景图像。
要创建具有所有必要状态的适当皮肤,您可以复制基本皮肤:spark.skins.spark.TitleWindowSkin
as MyTitleWindowSkin
,并为其添加一些自定义:
在 MetaData 标记中,您应该输入自定义 TitleWindow 类的名称:
<fx:Metadata>
<![CDATA[
[HostComponent("my.package.CustomTitleWindow")]
]]>
</fx:Metadata>
接受背景图像,
- 你应该声明一个变量: [Bindable] private var backgroundImage:*;
- 覆盖该
updateDisplayList(unscaledWidth,
unscaledHeight)
方法,并在其中初始化此成员:
backgroundImage =
getStyle("backgroundImage");
在该<!-- layer 2: background fill
-->
部分中,在纯色填充 ( <s:Rect
id="background"...
) 之后,您应该放置以下代码段:
<s:Rect id="backgroundImg"
left="1" right="1"
top="{topGroup ? topGroup.height : 0}"
bottom="{bottomGroup ? bottomGroup.height : 0}">
<s:fill>
<!-- BackgroundImage -->
<s:BitmapFill id="img" source="{backgroundImage}"
smooth="true" fillMode="scale" />
</s:fill>
</s:Rect>
接下来,您需要创建一个新类 ( my.package.CustomTitleWindow
),它扩展了 TitleWindow,设置它的皮肤,并绑定 backgroundImage 样式:
<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
skinClass="my.package.MyTitleWindowSkin">
<fx:Metadata>
[Style(name="backgroundImage", type="*")]
</fx:Metadata>
<mx:VBox width="100%" height="100%">
<mx:Text text="{IMyConstants.LOREMIPSUM}" width="100%" height="100%" />
<s:Button label="Do something" />
</mx:VBox>
</s:TitleWindow>
最后是一个小测试(在我身边工作得很好,我希望它更接近你正在寻找的东西):
<s:VGroup width="100%" height="100%" paddingLeft="10" paddingTop="10" paddingRight="10">
<my:CustomTitleWindow title="Window without background image"
width="100%" height="50%" />
<my:CustomTitleWindow title="Window with background image"
width="100%" height="50%" backgroundImage="{IMyConstants.MYLOGO}" />
</s:VGroup>
更新
要从 css 文件设置皮肤和背景图像,您只需要进行一些小的修改:
创建一个包含内容的 CSS 文件:
/* CSS file */
@namespace s "library://ns.adobe.com/flex/spark";
@namespace mx "library://ns.adobe.com/flex/mx";
@namespace my "your.package.*";
my|CustomTitleWindow {
skin-class: ClassReference("your.package.MyTitleWindowSkin");
}
.twWithBgImage {
background-image: Embed("icons/logo.png");
}
测试看起来像:
<s:VGroup width="100%" height="100%" paddingLeft="10" paddingTop="10" paddingRight="10">
<my:CustomTitleWindow title="Window without background image"
width="100%" height="50%" />
<my:CustomTitleWindow title="Window with background image"
width="100%" height="50%" styleName="twWithBgImage" />
</s:VGroup>
并且您需要从 CustomTitleWindow 类中删除皮肤声明:skinClass="your.package.MyTitleWindowSkin"
。
当然,您不需要将皮肤应用到 my|CustomTitleWindow 类,您可以将它仅用于 css 类,这样您肯定不需要修改现有组件。
更新——没有自定义组件
忘记 CustomTitleWindow 类。
skinnedtw.css
/* CSS file */
@namespace s "library://ns.adobe.com/flex/spark";
@namespace mx "library://ns.adobe.com/flex/mx";
.twWithBgImage {
skin-class: ClassReference("your.package.MyTitleWindowSkin");
background-image: Embed("icons/logo.png");
}
测试应用程序.mxml
<?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:Style source="assets/skinnedtw.css" />
<s:VGroup width="100%" height="100%" paddingLeft="10" paddingTop="10" paddingRight="10">
<s:TitleWindow title="Window without background image"
width="100%" height="50%">
<mx:VBox width="100%" height="100%">
<mx:Text text="{IMyConstants.LOREMIPSUM}" width="100%" height="100%" />
<s:Button label="Do something" />
</mx:VBox>
</s:TitleWindow>
<s:TitleWindow title="Window with background image"
width="100%" height="50%" styleName="twWithBgImage">
<mx:VBox width="100%" height="100%">
<mx:Text text="{IMyConstants.LOREMIPSUM}" width="100%" height="100%" />
<s:Button label="Do something" />
</mx:VBox>
</s:TitleWindow>
</s:VGroup>
</s:WindowedApplication>
我的输出仍然如下所示: