Добавление фонового изображения к компоненту mx при использовании flex 4 - PullRequest
3 голосов
/ 09 апреля 2011

Опять же, тематический вопрос. Поскольку для проекта, над которым я работаю, требуются старые библиотеки , которые расширяют компоненты mx (такие как TitleWindow и TabNavigator), я не могу напрямую использовать то, что я знаю о скинах Spark. Однако, поскольку проект программируется с использованием темы Spark по умолчанию (с моими изменениями сверху), а не темы Halo, у меня, по-видимому, нет доступа к нужным стилям (а именно backgroundImage и contentBackgroundImage, которые, очевидно, требуют, чтобы Halo был активным ). Простая установка Halo в качестве темы сломает другие вещи, не последнюю из которых моя собственная тема. Планируется заменить старые библиотеки или, по крайней мере, исправить их на Flex 4, но на данный момент мне нужен способ стилизации / оформления этих компонентов без непосредственного их изменения.

Было бы нелепо, если бы я не смог добавить фоновое изображение в область контента TitleWindow! Я весь день искал в Интернете максимумы и минимумы и пробовал бесчисленные вариации стилей, скинов, селекторов и их комбинации без удачи. Никто не знает, как добавить фоновое изображение к содержимому mx TitleWindow при использовании Flex 4.1 SDK?!

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

На самом деле, это не единственный способ, как вы уже упоминали, жестко закодированный способ: извините за это. Вы также можете сделать скин для вашего компонента TitleWindow для принятия фоновых изображений.

Чтобы создать соответствующий скин со всеми необходимыми состояниями, вы можете скопировать базовый скин: spark.skins.spark.TitleWindowSkin как MyTitleWindowSkin и добавить к нему некоторые настройки:

В теге MetaData вы должны ввести имя вашего пользовательского класса TitleWindow:

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

Чтобы принять backgroundImage,

  • вы должны объявить переменную: [Bindable] частный 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");
}

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>

Мой вывод все еще выглядит так: enter image description here

0 голосов
/ 11 апреля 2011

если у вас нет явных членов в вашем mx: TitleWindow, вам следует рассмотреть возможность использования искры 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>

Я надеюсь, что понял вашу проблему, и это помогает.

...