2011-08-15 35 views
2

例如,假設我有3個的RichEditableText對象,我希望能夠以突出它們放在一起:可能在Flex中的多個RichEditableText對象之間選擇文本?

<s:RichEditableText id="obj_one" width="100%" text="Click and start dragging the highlight here..." selectable="true" editable="false" fontSize="9" /> 
<s:RichEditableText id="obj_two" width="100%" text="Continue dragging the highlight through this one" selectable="true" editable="false" fontSize="9" /> 
<s:RichEditableText id="obj_three" width="100%" text="and keep going and finish highlighting them all right here" selectable="true" editable="false" fontSize="9" /> 

它甚至有可能做出這等三個可以突出一個人這樣,才能複製所有三個一次又一遍地過去所有的文本?

謝謝!

編輯:我應該澄清,他們會是這樣的原因是因爲他們在一個itemRenderer中,所以他們每個都是他們自己的對象在列表中的每一行。這將是很好,雖然如果文本可以突出顯示和複製,但它們都是在一起。

想象一下,最終用戶希望能夠拖拽突出顯示標準html文檔中的任何其他文本以將其粘貼到別處的方式。

回答

0

只需在背景顏色中添加一個樣式到RichEditableText。並將每個組件的數據保存在ArrayCollection對象中。你可以在需要的時候得到它。

var mydata:ArrayCollection = new ArrayCollection(); 
mydata.addItem({value:obj_one.text}); 
mydata.addItem({value:obj_two.text}); 
mydata.addItem({value:obj_three.text}); 
OtherTextarea.text = mydata.getItemAt(0).value + " " .... etc 
+0

那麼這可能是一種使用代碼複製文本的方法。但就像我在問題中所說的,我期待看看是否有可能創建一個最終用戶可以在文本之間拖動和突出顯示的情況。他們希望能夠在本地HTML文檔上獲得的方式 – brybam

1

感謝Text Layout Framework您現在可以通過文本進行任何操作。但有時實施起來可能會很艱鉅。

我有兩個解決方案給你。根據你所需要的控制級別,有一個簡單的和一個難。

最簡單的辦法

對於大多數使用情況下,這個解決方案應該做的罰款。我假設你想以段落式的方式顯示這些文本。在這種情況下,你可以只使用一個RichEditableText和使用,而不是texttextFlow屬性,像這樣:

MXML

<s:RichEditableText id="textBox" top="100" paragraphSpaceAfter="15" /> 

AS

textBox.textFlow = TextFlowUtil.importFromString(
    "<p>Click and start dragging the highlight here...</p>" + 
    "<p>Continue dragging the highlight through this one</p>" + 
    "<p>and keep going and finish highlighting them all right here</p>" 
); 

就是這樣。我使用paragraphSpaceAfter樣式來在段落之間添加一些間距。您還可以將樣式添加到任何特定段落,以便更精確地控制其定位。

難的方法

如果你真的需要非常具體的控制(例如,如果三個文本框將必須在三個完全獨立的地方),那麼你可以做這樣的:

MXML

<mx:UIComponent id="obj_one" left="0" top="0" width="300" height="20"/> 
<mx:UIComponent id="obj_two" left="50" top="30" width="300" height="20" /> 
<mx:UIComponent id="obj_three" left="100" top="60" width="200" height="40" /> 

AS

//create the TextFlow object 
var text:TextFlow = TextFlowUtil.importFromString(
    "<p>Click and start dragging the highlight here...</p>" + 
    "<p>Continue dragging the highlight through this one</p>" + 
    "<p>and keep going and finish highlighting them all right here</p>" 
); 
//make the text selectable 
text.interactionManager = new SelectionManager(); 

//make all three of the area's control the same TextFlow object 
text.flowComposer.addController(
    new ContainerController(obj_one, obj_one.width, obj_one.height)); 
text.flowComposer.addController(
    new ContainerController(obj_two, obj_two.width, obj_two.height)); 
text.flowComposer.addController(
    new ContainerController(obj_three, obj_three.width, obj_three.height)); 

//once the 3 controllers are assigned, recalculate the composition 
text.flowComposer.updateAllControllers(); 

正如你所看到的,我沒有爲此使用RichEditableText,因爲它已經使用了一個自己的流程聚合器和交互管理器,它會與我正在分配的流程衝突。現在您可以根據需要定位和調整三個容器的大小。

但請記住: 大多數使用案例都可以通過簡單解決方案的某些樣式來解決。 (我在此使用的MXML實際上很容易證明這種方法的合理性,但我必須以簡單的方式傳達這個想法)

+0

就像我在我的問題中所說的,這些RichEditableText對象位於我爲List創建的itemRenderer中。 RichEditableText中出現的任何內容都是動態的,並在現場創建。在該設置中執行您的建議並將其構建到itemRenderer中是否可行? – brybam

+0

@brybam如果你想讓每個段落在它自己的ItemRenderer中,它可以用'艱難的方式'來完成,但當然它會比我的答案中的示例稍微複雜一些。我真的無法看到_why_你想要做這樣的事情,儘管它會干擾List的正常功能。要麼這真的是一個列表,然後它應該像一個行爲(即你點擊一個項目>發生的事情),或者你只是想顯示一些文本塊,在這種情況下,你可以使用我提供的解決方案。 – RIAstar

+0

順便說一句:我試圖找到一個更容易的問題的具體部分的解決方案:我創建了一個列表,併爲每個RichEditableText分配相同的'SelectionManager',但它不起作用。所有容器必須共享相同的「TextFlow」對象才能工作。 – RIAstar

相關問題