1

目前,似乎每次在文本框中按下 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;
}

有任何想法吗 ?

谢谢 !

4

3 回答 3

4

这是@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 的问题:只需要一个事件处理程序而不是多个。

于 2012-08-13T09:22:53.343 回答
1

Spark在您每次击键时TextInput调度一个TextOperationEvent.CHANGE事件。

但是,与 Flextras 所指的KeyboardEvent不同,此事件不会告诉您按下了哪些键。相反,该事件有一个操作属性,它是描述更改的FlowOperation 。

但不要为此烦恼。由于 change 事件将在每次击键时发送,因此将 的值TextInput与上一个 change 事件的值进行比较。

private var lastTextInputValue:String = "";

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

    }
    else
    {

    }
    lastTextInputValue = textInput.text;
}
于 2012-08-13T04:26:49.180 回答
0

你可以尝试这样的事情:

<?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,代码将启用该按钮。如果没有,该按钮将被禁用并且标志重置为假。

于 2012-08-13T05:44:11.697 回答