0

問題は非常に単純です。Button を拡張して ImageButton を作成し、ButtonSkin を拡張して ImageButtonSkin を作成します。しかし、次のように hostComponent を定義すると:

public var hostComponent:ImageButton

ButtonSkinBase 内で hostComponent:ButtonBase と競合しているというエラーが表示されます。

スキンを拡張して新しい hostComponent を提供するにはどうすればよいですか?

4

1 に答える 1

2

スキンを拡張して新しい hostComponent を提供するにはどうすればよいですか?

なぜあなたはしなければならないのですか?hostComponent は ButtonBase であり、これは ImageButton が拡張するものです。hostComponent のタイプを変更する必要があるのはなぜですか? hostComponent に ImageButton としてアクセスする必要がある場合は、次のようにキャストできます。

var myImageButton : ImageButton = hostComponent as ImageButton;

この質問へのコメントで、あなたは次のように述べています。

で、スキンを拡張できるのに、親スキンが指定したコンポーネントにしか使えない、すごい。

それはまったく真実ではないはずです。hostComponent には ButtonBase のタイプがあると言いましたが、ButtonSkin を拡張しています。あなたのステートメントでは、Button コンポーネントで ButtonSkin を使用することはできず、ButtonBase コンポーネントでのみ使用できます。そうではありません。

また、メタデータに関する @RIAstar のコメントに 1 つの説明を追加します。メタデータは、コンパイラによるコードヒントと MXML パラメータのチェックにのみ使用されます。それらのいずれかを使用せずに簡単にスタイルを作成できます。setStyle メソッドを使用して値を設定するだけです。

myHostComponent.setStyle('myImageColor',0x000000);

そして、次のようにスキンで使用できます。

this.getStyle('myImageColor');

メタデータが宣言されていなくても、CSS を介してスタイルを設定することもできます。Spark コンポーネントのライフサイクルを使用すると、コンポーネントがそのスタイルを初期化する前にスタイルを設定することが完全に可能になります。

于 2012-02-10T15:18:53.557 に答える