3

繰り返しますが、テーマの質問です。私が取り組んでいるプロジェクトには、 mx コンポーネント (TitleWindow や TabNavigator など) を拡張する古いライブラリが必要なので、Spark スキニングについて知っていることを直接使用することはできません。ただし、プロジェクトは Halo テーマではなくデフォルトの Spark テーマ (変更を加えたもの) を使用してプログラムされているため、必要なスタイル (backgroundImage と contentBackgroundImage には Halo をアクティブにする必要があるようです) にアクセスできないようです。 )。Halo をテーマに設定するだけで、私自身のテーマだけでなく、他のものも壊れてしまいます。古いライブラリを置き換えるか、少なくとも Flex 4 へのパッチを適用する計画が進行中ですが、現時点では、これらのコンポーネントを直接変更せずにスタイル/スキンを適用する方法が必要です。

TitleWindow のコンテンツ領域に背景画像を追加できないというのはばかげています。私は一日中インターネットを高低で検索し、スタイル、スキン、セレクター、およびそれらの組み合わせの無数のバリエーションを試しましたが、うまくいきませんでした. Flex 4.1 SDK を使用しているときに mx TitleWindow のコンテンツに背景画像を追加する方法を誰も知りませんか?!

4

2 に答える 2

2

実際、これが唯一の方法ではありません。おっしゃるように、ハードコードされた方法です。申し訳ありません。TitleWindowコンポーネントにスキンを適用して、背景画像を受け入れることもできます。

必要なすべての状態で適切なスキンを作成するには、ベーススキンをコピーしspark.skins.spark.TitleWindowSkinMyTitleWindowSkin、それにカスタマイズを追加します。

MetaDataタグに、カスタムTitleWindowクラスの名前を入力する必要があります。

<fx:Metadata>
    <![CDATA[ 
        [HostComponent("my.package.CustomTitleWindow")]
    ]]>
</fx:Metadata> 

backgroundImageを受け入れるには、

  • 変数を宣言する必要があります:[Bindable] private var backgroundImage:*;
  • メソッドをオーバーライドし updateDisplayList(unscaledWidth, unscaledHeight)、その内部でこのメンバーを初期化します。 backgroundImage = getStyle("backgroundImage");
  • この<!-- layer 2: background fill -->セクションのsolid-color-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");
}

TestApp.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>

私の出力はまだ次のようになります: ここに画像の説明を入力してください

于 2011-04-11T20:45:26.017 に答える
0

mx:TitleWindow に明示的なメンバーがない場合は、最初の子として Spark BorderContainer を使用することを検討する必要があります。背景イメージを指定できるからです。
私はこのようなことを考えています:

<?xml version="1.0" encoding="utf-8"?>
<mx: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" layout="absolute" 
    width="400" height="300" backgroundAttachment="">
    <s:BorderContainer backgroundImage="{IMyConstants.MYLOGO}" 
        width="100%" height="100%" backgroundAlpha=".5" />
    <mx:VBox width="100%" height="100%">
        <mx:Text text="{IMyConstants.LOREMIPSUM}" width="100%" height="100%" />
        <mx:Button label="Do something" />
    </mx:VBox>
</mx:TitleWindow>

私はあなたの問題を理解したと思います.これは役に立ちます.

于 2011-04-11T10:50:35.467 に答える