2009-07-16 3 views
1

Хорошо, я пытаюсь добавить «настраиваемое свойство» к части текста в элементе управления RichTextBox. Я думал, что это будет легко, но, по-видимому, нет :-)WPF RichTextBox Пользовательское текстовое свойство

Основная функциональность, которую я хочу, - это возможность установить свойство на конкретном слове и иметь возможность обнаруживать, когда слово двойным щелчком, если это свойство есть или нет.

Мой внутренний подход состоял в том, чтобы создать новый DP и применить его к тексту, но TextRange на самом деле не является DependencyObject и Reflector показывает, что он принимает только определенные DP, которые он отображает непосредственно на «реальные» свойства.

К сожалению, я не могу найти никакого другого «крючка», чтобы позволить мне сделать это. Я не могу унаследовать от того, что я МОЖЕТ применить к тексту, поскольку все, что мне нужно, либо запечатано, либо содержит внутренние тезисы, так что я немного потеряю.

Я мог бы просто отслеживать диапазоны, которые имеют свойство извне, и обновлять их, поскольку текст обновляется, но это звучит довольно ужасно, и я действительно не хочу создавать свой собственный RichTextBox только для этого особенность!

Любые предложения будут приветствовать :-)

ответ

2

Личные expierience с RichTextBox узнал меня, что этот контроль может объединить команду Выполнить и перегонах, если они похожи друг на друга, то есть вы потеряете пользовательскую информацию, которую вы пытались установить с TextRange. Это произошло много с перекрывающимися областями TextRange. Таким образом, вы не можете использовать TextRange для этой проблемы.

У нас были подобные проблемы с этим управлением, и на самом деле у нас был небольшой грязный хак. Вот что мы закончили:

Вы можете вставить элементы InlineUIContainer и BlockUIContainer в свой FlowDocument. Внутри одного из этих контейнеров вы можете поместить любой UIElement, который вы хотите. Мы закончили создание прикрепленного свойства и разместили эти драгоценные камни информации внутри элементов управления Control, которые жили в этих UIContainers.

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

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

+0

Отлично .. Я пытался найти подобный «хак», который позволил бы мне «ввести» что-то в документ, но ничего не нашел. Я посмотрю на InlineUIContainer и BlockUIContainer .. спасибо! –

0

InlineUIContainers будет не будет сохранен в TextRange.Save вызов для XamlPackage, хотя, даже если preserveTextElements истинно. Я думаю, вам нужно использовать XamlWriter для сохранения InlineUIContainers, но тогда вы теряете возможность встраивать изображения в документ.

Мне еще нужно найти способ встраивания пользовательских свойств на куски документа и возможность встраивания изображений.

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