私はあなたがデフォルトButtonBar
を拡張するべきだと思います。
package
{
import mx.core.IFactory;
import spark.components.ButtonBar;
[SkinState("minimized")]
[SkinState("minimizedDisabled")]
public class MinimizableButtonBar extends ButtonBar
{
public function MinimizableButtonBar()
{
super();
itemRendererFunction = defaultButtonBarItemRendererFunction;
}
[SkinPart(required="true", type="mx.core.IVisualElement")]
public var middleButtonMinimized:IFactory;
private var _minimized:Boolean;
[Bindable]
public function get minimized():Boolean
{
return _minimized;
}
public function set minimized(value:Boolean):void
{
if (_minimized == value)
return;
_minimized = value;
invalidateSkinState();
itemRendererFunction = defaultButtonBarItemRendererFunction;
}
override protected function getCurrentSkinState():String
{
if (_minimized)
return enabled ? "minimized" : "minimizedDisabled";
return super.getCurrentSkinState();
}
private function defaultButtonBarItemRendererFunction(data:Object):IFactory
{
var i:int = dataProvider.getItemIndex(data);
if (i == 0)
return firstButton ? firstButton : (_minimized ? middleButtonMinimized : middleButton);
var n:int = dataProvider.length - 1;
if (i == n)
return lastButton ? lastButton : (_minimized ? middleButtonMinimized : middleButton);
return (_minimized ? middleButtonMinimized : middleButton);
}
}
}
ですから、次の方法を使用してカスタムスキンを宣言することができ、このコードを使用して::
<?xml version="1.0" encoding="utf-8"?>
<s:Skin alpha.disabledGroup="0.5" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Metadata>[HostComponent("MinimizableButtonBar")]</fx:Metadata>
<s:states>
<s:State name="normal" />
<s:State name="disabled" stateGroups="disabledGroup" />
<s:State name="minimized" stateGroups="minimizedGroup" />
<s:State name="minimizedDisabled" stateGroups="disabledGroup,minimizedGroup" />
</s:states>
<fx:Declarations>
<fx:Component id="firstButton">
<s:ButtonBarButton skinClass="spark.skins.spark.ButtonBarFirstButtonSkin" />
</fx:Component>
<fx:Component id="middleButton">
<s:ButtonBarButton skinClass="spark.skins.spark.ButtonBarMiddleButtonSkin" />
</fx:Component>
<fx:Component id="middleButtonMinimized">
<s:ButtonBarButton skinClass="MinimazedButtonBarMiddleButtonSkin" />
</fx:Component>
<fx:Component id="lastButton">
<s:ButtonBarButton skinClass="spark.skins.spark.ButtonBarLastButtonSkin" />
</fx:Component>
</fx:Declarations>
<s:DataGroup height="100%" id="dataGroup" width="100%">
<s:layout>
<s:ButtonBarHorizontalLayout gap="-1" />
</s:layout>
<s:layout.minimizedGroup>
<s:VerticalLayout />
</s:layout.minimizedGroup>
</s:DataGroup>
</s:Skin>
・ホープこれはあなたの問題を解決し、このような何か。
最小化された状態が中ボタンスキンを変更する場合にのみ、カスタムコンポーネントとスキンの両方からすべての状態関連コードを削除できます。
私は既に最小化状態を維持するためにButtonBarの拡張を持っていますので、あなたの答えは実際に私が考えていたものと一線を画しています。私は、アイテムレンダラーの機能のオーバーライドについては知らなかったが、私はそのトリックを行うだろうと思う。 1つのmiddleButton宣言だけを持ち、その上でスキンを切り替えたり、宣言のスキンで状態を設定する方法はありますか? – Michael
ご覧のとおり、ボタンは「IFactory」として表されます。したがって、宣言的に状態を設定する方法はないようです。 1つの宣言だけを持ってスキンを切り替えるのはどうでしょうか?通常の 'List'のアイテムレンダラーと同じ方法が考えられます。ボタンのスキンはレンダラーであり、 'ButtonBar'は一種のリストであることを覚えておいてください。したがって、データプロバイダーのフィールド値を変更して、レンダラーに別の状態を切り替えるよう通知することができます。 – Constantiner
このソリューションは機能しますが、最小化された中間ボタンのSkinPart.required = trueプロパティを削除する必要がありましたが、理由はわかりません。私は、必要なSkinPartとして最小化されたボタンを持っている場合、私は実行時の例外が、必要な部分が欠落していることを宣言しても、それが依然として必要な部分であることを望むであろう。その上の任意のアイデア? – Michael