0

NumericStepperのようなFlex3のコントロールが必要ですが、任意の文字列を表示できます。このコントロールは存在しますか?そうでない場合、それを作成するためのあなたの提案、またはあなたが推奨する参考文献は何ですか?

便宜上、これをTextStepperと呼んでいます。これは、ユーザーが上/下ボタンをクリックして循環できる文字列の選択肢のリストを表示するためのコンパクトな方法として必要です。コンパクトとは、コントロールのドロップダウンまたはポップアップの側面がないことを意味します。選択したインデックスを変更する唯一の方法は、上/下ボタン(テキスト入力値を更新する)をクリックすることです。値の循環とは、基盤となるdataProviderを循環バッファーとして扱いたいということです。したがって、上/下クリックは、selectedIndexをモジュロ方式で変更します。

4

2 に答える 2

0

アイデアは使用することvalueFormatFunctionです:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:local="*">

    <local:StringStepper horizontalCenter="0" verticalCenter="0" width="200">
        <local:dataProvider>
            <s:ArrayCollection>
                <fx:String>Hello!</fx:String>
                <fx:String>I love you.</fx:String>
                <fx:String>Won't you tell me your name?</fx:String>
            </s:ArrayCollection>
        </local:dataProvider>
    </local:StringStepper>

</s:Application>

StringStepper のソース:

package
{
import mx.collections.ArrayCollection;
import mx.events.CollectionEvent;

import spark.components.NumericStepper;

public class StringStepper extends NumericStepper
{
    public function StringStepper()
    {
        enabled = false;
        valueFormatFunction = defaultValueFormatFunction;
        valueParseFunction = defaultValueParseFunction;
    }

    private var _dataProvider:ArrayCollection;

    public function get dataProvider():ArrayCollection
    {
        return _dataProvider;
    }

    public function set dataProvider(value:ArrayCollection):void
    {
        if (_dataProvider == value)
            return;

        if (_dataProvider)
            _dataProvider.removeEventListener(CollectionEvent.COLLECTION_CHANGE,
                dataProvider_collectionChangeHandler);

        _dataProvider = value;
        commitDataProvider();

        if (_dataProvider)
            _dataProvider.addEventListener(CollectionEvent.COLLECTION_CHANGE,
                dataProvider_collectionChangeHandler);
    }

    /**
     * Same event as for <code>value</code>.
     */
    [Bindable("valueCommit")]
    public function get selectedItem():Object
    {
        return _dataProvider && value <= _dataProvider.length - 1 ? _dataProvider[value] : null; 
    }

    public function set selectedItem(value:Object):void
    {
        if (!_dataProvider)
            return;

        value = _dataProvider.getItemIndex(value);
    }

    private function defaultValueFormatFunction(value:Number):String
    {
        return _dataProvider && value <= _dataProvider.length - 1 ? _dataProvider[value] : String(value);
    }

    private function defaultValueParseFunction(value:String):Number
    {
        if (!_dataProvider)
            return 0;

        var n:int = _dataProvider.length;
        for (var i:int = 0; i < n; i++)
        {
            var string:String = _dataProvider[i];
            if (string == value)
                return i;
        }
        return 0;
    }

    private function commitDataProvider():void
    {
        if (!_dataProvider)
        {
            minimum = 0;
            maximum = 0;
            enabled = false;
            return;
        }

        enabled = true;
        minimum = 0;
        maximum = _dataProvider.length - 1;
    }

    private function dataProvider_collectionChangeHandler(event:CollectionEvent):void
    {
        commitDataProvider();
    }

}
}
于 2010-06-26T10:08:41.673 に答える
0

これらの 1 つを (MXML コンポーネントとして) を(絶対配置TextInputの) の上に重ねて作成し、が の入力部分を覆うようにしました。NumericStepperTextInputNumericStepper

dataProvider はArrayCollection文字列の であり、 の値はNumericStepperArrayCollection のインデックスにアクセスするために使用されました。

の変更イベントは、NumericStepperのテキストをTextInputdataProvider のインデックス n にあるものに変更しました。コンポーネントに編集可能なプロパティを指定して、TextInputを編集可能に設定し、新しい文字列を dataProvider の現在のインデックスに挿入しました。

于 2010-06-26T12:56:52.330 に答える