Как игнорировать события Ctrl-C в flex, которые не меняют содержимое текстового поля?

В настоящее время кажется, что каждый раз, когда Ctrl-C нажимается в текстовом поле для копирования его содержимого, текстовое поле получает Event.CHANGE, и, таким образом, наше приложение решает, что в текстовое поле было внесено изменение, и включает кнопку «применить изменения». , хотя никаких изменений не было сделано, и все, что хотел пользователь, это скопировать содержимое текстового поля. Мы используем компонент текстового поля spark.components.TextInput.

При инициализации представления я регистрирую:

_view.hostNameTextBox.addEventListener(
    Event.CHANGE, onConnectionDat‌aChanged, false, 0, true
);

И функция прослушивателя событий:

private function onConnectionDataChanged(e:Event):void {
    _view.applyButton.enabled = true;
}

Любые идеи ?

Спасибо !


person Baruch Oxman    schedule 12.08.2012    source источник
comment
Покажите какой-нибудь код, пожалуйста. В вашем обработчике событий для события клавиатуры вы должны иметь возможность проверить, была ли выбрана C и нажата ли клавиша управления; но Event.CHANGe не является событием клавиатуры, поэтому вам действительно нужно объяснить, какое событие вы слушаете и какой тип компонента вы слушаете.   -  person JeffryHouser    schedule 13.08.2012
comment
При инициализации представления я регистрирую: _view.hostNameTextBox.addEventListener(flash.events.Event.CHANGE,onConnectionDataChanged,false, 0, true); И функция прослушивателя событий: частная функция onConnectionDataChanged(e:Event):void { _view.applyButton.enabled = true; }   -  person Baruch Oxman    schedule 13.08.2012
comment
Отредактируйте свой пост и добавьте код в пост; пожалуйста. Обязательно выделите и нажмите кнопку Фигурная скобка в поле редактирования вопроса. это облегчит чтение.   -  person JeffryHouser    schedule 13.08.2012


Ответы (3)


Вот небольшая вариация ответа @Sunil D.: используйте свойство operation события, чтобы определить, была ли текущая операция операцией копирования или другой:

private function inputChangeHandler(event:TextOperationEvent):void {
    var operation:IOperation = event.operation;
    if (operation is CopyOperation) trace("Ctrl+C was pressed");
    if (operation is InsertTextOperation) trace("New text was inserted");
    if (operation is DeleteTextOperation) trace("Some text was deleted");
}

Этот подход также решит вашу проблему с несколькими TextInputs: требуется только один обработчик событий вместо многих.

person RIAstar    schedule 13.08.2012
comment
Хорошая идея! ... На самом деле есть некоторые другие операции, которые могут означать, что было сделано редактирование (например: PasteOperation, CutOperation и UndoOperation) - person Sunil D.; 13.08.2012

Spark TextInput отправляет TextOperationEvent.CHANGE событие при каждом нажатии клавиши.

Однако в отличие от KeyboardEvent, который Flextras имеет в виду, это событие не говорит вам, какие клавиши были нажаты. Вместо этого событие имеет операцию свойство, которое является FlowOperation который описывает изменение.

Но не беспокойтесь об этом. Поскольку событие изменения будет отправляться при каждом нажатии клавиши, сравните значение TextInput со значением из предыдущего события изменения.

private var lastTextInputValue:String = "";

private function inputChangeHandler(event:Event):void
{
    if (textInput.text == lastTextInputValue)
    {

    }
    else
    {

    }
    lastTextInputValue = textInput.text;
}
person Sunil D.    schedule 13.08.2012
comment
Я надеялся избежать этого, но если нет способа избежать этого, я попробую добавить его (проблема в том, что это для 4 разных полей, поэтому код может стать немного уродливым...) - person Baruch Oxman; 13.08.2012
comment
Другая проблема заключается в том, что я использую один и тот же слушатель для нескольких разных полей (имя хоста, имя пользователя и т. д.), поэтому теперь мне придется разделить его на несколько слушателей... - person Baruch Oxman; 13.08.2012

Вы можете попробовать что-то вроде этого:

<?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">
    <fx:Script>
        <![CDATA[
            import spark.events.TextOperationEvent;

            protected function inPutText_changeHandler(event:TextOperationEvent):void
            {
                // TODO Auto-generated method stub
                if(ctrlCPressed)
                {
                    clickBtn.enabled = false;
                    ctrlCPressed = false;
                }
                else
                {
                    clickBtn.enabled = true;
                }
            }

            private var ctrlCPressed:Boolean = false;
            protected function inPutText_keyDownHandler(event:KeyboardEvent):void
            {
                // TODO Auto-generated method stub
                if(event.ctrlKey == true && event.keyCode == Keyboard.C)
                    ctrlCPressed = true;
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>
    <s:TextInput id="inPutText" change="inPutText_changeHandler(event)" text="Mahesh Parate"
                 keyDown="inPutText_keyDownHandler(event)"/>
    <s:Button id="clickBtn" label="Click" enabled="false"/>
</s:Application>

Компонент TextInput содержит два слушателя, один для события TextInput.CHANGE и один для KeyboardEvent.KEY_DOWN. Слушатель keyDown обнаружит, есть ли CTRL+C, и установит флаг. Когда событие CHANGE обрабатывается, этот прослушиватель проверяет, установлен ли флаг для CTRL+C, и предпринимает соответствующие действия. Если было нажато CTRL+C, код активирует кнопку. В противном случае кнопка будет отключена, а флаг сброшен на false.

person Mahesh Parate    schedule 13.08.2012