Определение «сквозного» стиля в Actionscript - PullRequest
0 голосов
/ 23 марта 2012

У меня есть пользовательский компонент с именем ButtonPanel, написанный на Actionscript.По сути, это просто панель, которая отображает mx:ButtonBar в верхнем правом углу строки заголовка mx:Panel и реагирует на нажатия кнопок на панели.

Панель кнопок имеет три стиля, доступных для кнопок:buttonStyleName, firstButtonStyleName и lastButtonStyleName.Я хочу написать эти стили для ButtonPanel, чтобы, если он был объявлен так:

<comp:ButtonPanel buttonStyleName="myButtonStyle" ... />

, тогда ButtonPanel пропустит стиль и установит соответствующий стиль ButtonBar.

Я действительно понятия не имею, с чего начать, потому что я никогда не ошибался с определением стилей.Может кто-нибудь помочь?

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

То, что вы называете «сквозными» стилями, на самом деле называется наследующими стилями. Решение вашего вопроса на самом деле довольно просто.

Вы используете метаданные стиля в своем пользовательском компоненте, чтобы объявить, что у ButtonPanel есть стилевое имя с именем 'buttonStyleName':

[Style(name="buttonStyleName", inherit="yes")]

public class ButtonPanel extends Panel {
     ....
}

Обратите внимание на флаг «наследовать», установленный в значение «истина»: это гарантирует, что любой компонент в вашей пользовательской панели, имеющий тот же стиль, унаследует значение, которое вы дали этому стилю на уровне панели. *

Установка этих метаданных обеспечит, чтобы FlashBuilder предлагал buttonStyleName как стиль, а не как свойство (как это было бы с решением Сэма).


Редактировать : уже определенные стили

Сначала я не осознавал, что вы имеете в виду mx ButtonBar (как это явно не упоминается). Причина, по которой это не работает для вас, состоит в том, что mx: ButtonBar уже определил эти стили как не наследуемые. Посмотрите на исходный код:

[Style(name="firstButtonStyleName", type="String", inherit="no")]
[Style(name="buttonStyleName", type="String", inherit="no")]
[Style(name="lastButtonStyleName", type="String", inherit="no")]

Из-за этого компилятор будет жаловаться, когда вы пытаетесь переопределить это определение в своей пользовательской панели, потому что он просто не знает, какую из противоречивых инструкций выбрать. Поэтому нам придется проделать немного больше работы, если вы хотите придерживаться mx: ButtonBar.

Сначала определите стили на ButtonPanel в точности так, как они определены в mx: ButtonBar, чтобы они имели одинаковую подпись (вы можете просто скопировать / вставить три строки выше). Это закроет компилятор, но стили больше не будут наследоваться, верно?

Поэтому нам придется передать их вручную: в вашей пользовательской обложке Panel переопределите метод updateDisplayList() и - при условии, что идентификатор ButtonBar равен 'buttonBar' - добавьте следующее:

    private const buttonStyles:Array = [
        "firstButtonStyleName",
        "buttonStyleName",
        "lastButtonStyleName"
    ];

    override protected function updateDisplayList(unscaledWidth:Number, 
                                                  unscaledHeight:Number):void 
    {
        if (buttonBar) 
            for each (var buttonStyle:String in buttonStyles)
                buttonBar.setStyle(buttonStyle, getStyle(buttonStyle));

        //some other code

        super.updateDisplayList(unscaledWidth, unscaledHeight);
    }

Это будет принимать стили с панели хоста и передавать их на панель кнопок.

0 голосов
/ 23 марта 2012

Чтобы передать эти стили, вам нужно только сохранить их как строковые переменные, а затем передать их на внутренний ButtonBar.

<mx:ButtonBar ... buttonStyleName="{buttonStyleName}" ... />

[Bindable]public var buttonStyleName:String;

Если эти две строки кода не объясняют этополностью для вас, дайте мне знать, и я могу конкретизировать мой пример.

...