PopUpButton с TileList и пользовательским рендерером - PullRequest
0 голосов
/ 26 июля 2010

Я подготовил простой тестовый пример для PopUpButton, открывающего TileList с черными и красными записями, и он в основном работает, но имеет 2 неудобства.

Я много искал, пробовал несколько вариантов (в моем рендерере были добавлены элементы [Bindable]; добавлен цветной элемент в массив ставок; создан метод public override set data () ;...) и тоже получал некоторые ответы, но они слишком общие.

Буду признателен, если кто-нибудь предложит код для устранения 2 проблем в моем коде:

1)Прокрутка «tl2» вправо-влево не работает хорошо: записи отображаются в сочетании красного и черного цветов.Я знаю, что TileList повторно использует itemRenderer, но как мне исправить проблему?

2) В режиме отладки я получаю множество предупреждений: warning: невозможно привязать свойство 'label' к классу Object (классне IEventDispatcher)

Спасибо, Алекс

MyRenderer.mxml:

    <?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
           verticalScrollPolicy="off" horizontalScrollPolicy="off"
           width="100%" height="100%">
    <mx:Script>
        <![CDATA[
            public static function findColor(str:String):uint {
                return (str.indexOf('♥') != -1 ||
                    str.indexOf('♦') != -1) ? 0xFF0000 : 0x000000;
            }
        ]]>
    </mx:Script>

    <mx:Label truncateToFit="true" width="60"
              text="{data.label}" color="{findColor(data.label)}"/>
</mx:Canvas>

MyTest.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                creationPolicy="all" applicationComplete="init(event);">
    <mx:Style>
        @font-face {
            src:url("C:\\WINDOWS\\Fonts\\arial.ttf");
            fontFamily: myFont;
            unicodeRange:
                U+0020-U+0040, /* Punctuation, Numbers */
                U+0041-U+005A, /* Upper-Case A-Z */
                U+005B-U+0060, /* Punctuation and Symbols */
                U+0061-U+007A, /* Lower-Case a-z */
                U+007B-U+007E, /* Punctuation and Symbols */
                U+0410-U+0451, /* cyrillic */
                U+2660-U+266B; /* card suits */
        }
        List, CheckBox, Label, Button, PopUpButton, TileList {
            fontFamily: myFont;
            fontSize: 24;
        }
    </mx:Style>

    <mx:Script>
        <![CDATA[
            import mx.controls.*;
            import mx.events.*;

            [Bindable]
            private var bids:Array;
            private var tl:TileList;

            private function init(event:FlexEvent):void {
                bids = createBids();
                pub.popUp = createList(bids);
            }

            private function createBids():Array {
                var arr:Array = [{label: 'Pass'}];
                for (var i:uint = 6; i <= 10; i++)
                    for (var j:uint = 0; j < 5; j++)
                        arr.unshift({label: i+'♠♣♦♥ '.charAt(j%5)});

                return arr;
            }

            private function createList(arr:Array):TileList {
                tl = new TileList();
                tl.maxColumns = 5;
                tl.width = 350;
                tl.height = 250;
                tl.dataProvider = arr;
                tl.itemRenderer = new ClassFactory(MyRenderer);
                tl.addEventListener('itemClick', itemClickHandler);

                if (arr.length > 0) {
                    tl.selectedIndex = arr.length - 1;
                    pub.label = arr[tl.selectedIndex].label;
                }

                return tl;
            }

            private function itemClickHandler(event:ListEvent):void {
                var index:uint = tl.columnCount * event.rowIndex + event.columnIndex;
                var label:String = bids[index].label;
                pub.label = label;
                pub.setStyle('color', MyRenderer.findColor(label));
                pub.close();
                tl.selectedIndex = index;
            }
        ]]>
    </mx:Script>

    <mx:Panel title="TileList scrolling problem" height="100%" width="100%"
              paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10">

        <mx:Label width="100%" color="blue" text="Select your bid:"/>

        <mx:TileList id="tl2" height="200" width="200"
                     maxColumns="5" rowHeight="30" columnWidth="60"
                     dataProvider="{bids}" itemRenderer="MyRenderer"/>
    </mx:Panel>

    <mx:ApplicationControlBar width="100%">
        <mx:Spacer width="100%"/>
        <mx:CheckBox id="auto" label="Auto:"/>
        <mx:Button id="left" label="&lt;&lt;"/>
        <mx:PopUpButton id="pub" width="90"/>
        <mx:Button id="right" label="&gt;&gt;"/>
    </mx:ApplicationControlBar>
</mx:Application>

Обновление:

Спасибо, Уэйд, предупреждение исчезло (я думаю, было неправильно использовать {data.label} в моем ярлыке), но "tl2" по-прежнемуесть проблемы с прокруткой.

Новый MyRenderer.mxml (все еще есть проблемы с прокруткой):

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
           verticalScrollPolicy="off" horizontalScrollPolicy="off"
           width="100%" height="100%">
    <mx:Script>
        <![CDATA[

            override public function set data(value:Object):void {
                super.data = value;

                var str:String = String(value.label);
                myLabel.text = str;
                myLabel.setStyle('color', findColor(str));
            }

            public static function findColor(str:String):uint {
                return (str.indexOf('♥') != -1 ||
                    str.indexOf('♦') != -1) ? 0xFF0000 : 0x000000;
            }
        ]]>
    </mx:Script>

    <mx:Label id="myLabel" truncateToFit="true" width="60"/>
</mx:Canvas>

1 Ответ

1 голос
/ 26 июля 2010

Вы можете позаботиться об обеих проблемах, переопределив метод набора данных для средства визуализации вашего элемента:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
           verticalScrollPolicy="off" horizontalScrollPolicy="off"
           width="100%" height="100%">
    <mx:Script>
        <![CDATA[
            override public function set data(value:Object):void {
                super.data = value;
                var str:String = value.label;
                this.myLabel.text = str;
                this.myLabel.setStyle("color", (str.indexOf('♥') != -1 ||
                    str.indexOf('♦') != -1) ? 0xFF0000 : 0x000000);
            }
        ]]>
    </mx:Script>

    <mx:Label id="myLabel" truncateToFit="true" width="60"/>
</mx:Canvas>

Поскольку средства визуализации используются повторно, лучший способ убедиться, что они обновлены правильно, этоиспользовать метод set data, поскольку он всегда вызывается при повторном использовании средства визуализации.Это также избавляет вас от предупреждения привязки, поскольку вы больше не привязываетесь к data.label.Примечание. Я не тестировал этот код, возможно, потребуется некоторая настройка :) Надеюсь, что это поможет.

РЕДАКТИРОВАТЬ: похоже, что ваша проблема "tl2" вызвана горизонтальной прокруткой списка листов, тогда как TileList выглядит так:оптимизировать для вертикальной прокрутки.Поскольку ваш набор данных конечен и относительно мал, я бы сделал список листов в полном размере, чтобы показать все элементы (исключая повторное использование средства визуализации элементов), и обернул его в холст, заданный в желаемых измерениях, и позволил бы холсту обрабатывать прокрутку.,Наверное, не тот ответ, который вы ищете, извините.

...