2011-08-15 2 views
2

Например, у меня есть 3 RichEditableText объекты, и я хочу, чтобы иметь возможность выделить их все вместе:Можно выбрать текст между несколькими объектами RichEditableText в Flex?

<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 и использовать textFlow свойство вместо text, как это:

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, чтобы добавить промежутки между параграфами. Вы также можете добавить стиль в любой конкретный параграф, чтобы дать вам еще более подробный контроль над их позиционированием.

Трудный путь

Если вы действительно необходимо для очень специфического контроля (например, если три Textboxes должен быть в трех совершенно отдельных местах), то вы можете сделать это следующим образом:

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" /> 

КАК

//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 для этого, так как он уже использует собственный компоновщик flowactionposiser и собственный менеджер взаимодействия, который будет конфликтовать с теми, которые я назначаю. Теперь вы можете поместить и изменить размер трех контейнеров по своему усмотрению.

Но помните: Большинство вариантов использования можно решить с помощью некоторого стиля на простом решении. (MXML, который я использовал в качестве примера здесь, на самом деле просто, чтобы оправдать этот подход, но я должен был передать идею в простой форме)

+0

Как я уже сказал в своем вопросе, эти объекты RichEditableText находятся в itemRenderer, который я сделал для List. все, что появляется в RichEditableText, динамично и создано на месте. Можно ли делать то, что вы предлагаете в этой настройке, и встроить его в itemRenderer? – brybam

+0

@brybam Если вы хотите иметь каждый абзац в своем собственном ItemRenderer, это может быть сделано «трудным путем», но, конечно, это будет немного сложнее, чем пример в моем ответе. Я действительно не могу понять, почему вы хотите сделать такое, хотя это будет мешать нормальной функциональности List. Либо это действительно список, а затем он должен вести себя как один (т. Е. Вы нажимаете элемент> что-то происходит), или просто хотите отобразить некоторые текстовые блоки, и в этом случае вы можете использовать предоставленные мной решения. – RIAstar

+0

BTW: Я попытался найти более легкое решение для этой конкретной части вопроса: я создал список и назначил один и тот же 'SelectionManager' для каждого' RichEditableText', но он не работает. Все контейнеры должны использовать один и тот же объект TextFlow для его работы. – RIAstar

Смежные вопросы