2012-08-12 39 views
1

目前,似乎每次在文本框中按Ctrl-C複製其內容時,文本框都會收到一個Event.CHANGE,因此我們的應用程序會決定在文本框中進行更改,並啓用「應用更改「按鈕,儘管沒有做出改變,並且所有用戶想要的是複製文本框內容。 我們正在使用的文本框組件spark.components.TextInput如何忽略flex中不改變文本框內容的Ctrl-C事件?

上查看初始化我註冊:

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

而且事件偵聽器的功能是:

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

任何想法?

謝謝!

+0

請顯示一些代碼。在鍵盤事件的事件處理程序中,您應該能夠檢查是否選擇了「C」並按下了控制鍵;但Event.CHANGe不是鍵盤事件,所以您確實需要解釋您正在偵聽的事件以及您正在偵聽的組件類型。 – JeffryHouser 2012-08-12 23:50:42

+0

查看初始化我註冊: _view.hostNameTextBox.addEventListener(flash.events.Event.CHANGE,onConnectionDataChanged,false,0,true); 並且事件監聽器函數是: private function onConnectionDataChanged(e:Event):void { _view.applyButton.enabled = true; } – 2012-08-13 05:09:51

+0

編輯您的帖子並將代碼添加到帖子;請。確保突出顯示並單擊問題編輯框上的「捲曲包圍」按鈕。這會讓閱讀更容易。 – JeffryHouser 2012-08-13 13:45:53

回答

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:只需要一個事件處理程序而不是很多。

+0

好主意! ......實際上有一些其他操作可能意味着編輯已經完成(例如:PasteOperation,CutOperation和UndoOperation) – 2012-08-13 14:31:50

1

The Spark TextInput在您製作的每個按鍵上分派一個TextOperationEvent.CHANGE事件。

但是,與Flextras所指的KeyboardEvent不同,此事件不會告訴您哪些按鍵被按下。相反,該事件具有operation屬性,該屬性是描述更改的FlowOperation

但是不要打擾。由於更改事件將在每次擊鍵時分派,因此將TextInput的值與上一個更改事件的值進行比較。

private var lastTextInputValue:String = ""; 

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

    } 
    else 
    { 

    } 
    lastTextInputValue = textInput.text; 
} 
+0

我希望避免這種情況,但如果沒有辦法避免它,我會嘗試添加它(這是4個不同領域的問題,所以代碼可能會變得有點醜陋...) – 2012-08-13 05:03:03

+0

另一個問題是我爲幾個不同的字段(主機名,用戶名等)使用相同的偵聽器,所以現在我必須將它分離爲幾個偵聽器... – 2012-08-13 05:14:02

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,代碼將啓用該按鈕。如果沒有,該按鈕將被禁用並且標誌重置爲假。