Flex, когда mxml описал компонент инициализировать его mxml описанные свойства - PullRequest
0 голосов
/ 28 мая 2011

Я пытаюсь переопределить класс Button, у меня есть несколько свойств, которые я хочу напрямую инициализировать с описанием mxml компонента, например:

<sl:TMyButton id="btnX" x="168" y="223" width="290" label="Button" myproperty1="10" myproperty2="101" myproperty3="4"/>

, какая функция активирована (для переопределенияэто) когда все свойства с описанием mxml полностью инициализируются со своими значениями?

1 Ответ

5 голосов
/ 28 мая 2011

Компоненты Flex имеют 4 метода в protected пространстве имен, которые должны быть переопределены для решения различных задач :

  • createChildren() - вызывает один раз для создания и добавления подкомпонентов.
  • measure() вызывается в процессе выкладки для расчета размера компонентов.
  • updateDisplayList() имеет ширину и высоту реального компонента в качестве параметра. Очевидно, этот метод удобен для позиционирования детей.
  • commitProperties() - это метод, который я предлагаю вам переопределить, чтобы применить значения свойств, для которых не требуется размер компонента.

Так что в вашем случае это может быть updateDisplayList() или commitProperties(). Я рекомендую вам следующие фрагменты кода:

private var myproperty1Dirty:Boolean;
private var _myproperty1:String;
public function set myproperty1(value:String):void
{
    if (_myproperty1 == value)
        return;
    _myproperty1 = value;
    myproperty1Dirty = true;
    // Postponed cumulative call of updateDisplayList() to place elements
    invalidateDisplayList();
}

private var myproperty2Dirty:Boolean;
private var _myproperty2:String;
public function set myproperty2(value:String):void
{
    if (_myproperty2 == value)
        return;
    _myproperty2 = value;
    myproperty2Dirty = true;
    // Postponed cumulative call of commitProperties() to apply property value
    invalidatePropertues();
}

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
    super.updateDisplayList(unscaledWidth, unscaledHeight);
    if (myproperty1Dirty)
    {
        // Perform children placing which depends on myproperty1 changes
        myproperty1Dirty = false;
    }
}

override protected function commitProperties():void
{
    super.commitProperties();
    if (myproperty2Dirty)
    {
        // Apply changes of myproperty2
        myproperty2Dirty = false;
    }
}

Надеюсь, это поможет!

...