2014-10-19 2 views
2

Как вы вставляете HyperLink в FlowDocument в определенной позиции? Новый HyperLink должен иметь такое же форматирование, как и окружающий текст, за исключением цвета (всегда должен быть синий) и подчеркивания (всегда следует подчеркивать). После установки HyperLink курсор должен быть сразу после нового HyperLink.FlowDocument: Вставить гиперссылку и сохранить форматирование

Что я пробовал:

TextPointer caretPosition = richTextBox.CaretPosition; 
TextPointer insertPosition = caretPosition.IsAtInsertionPosition ? caretPosition : caretPosition.GetInsertionPosition(LogicalDirection.Forward); 
string linkTitle = "Stack Overflow"; 

Run run = new Run(linkTitle); 

Hyperlink link = new Hyperlink(run, insertPosition); 
link.IsEnabled = true; 
link.NavigateUri = new Uri(@"http://www.stackoverflow.com"); 

richTextBox.CaretPosition = run.ContentEnd; 

Это работает, но новый гиперссылок не имеет форматирования это окружающий текст.

this.CaretPosition = this.CaretPosition.GetPositionAtOffset(0, LogicalDirection.Forward); 
insertPosition.InsertTextInRun(linkTitle); 

Hyperlink link = new Hyperlink(insertPosition, insertPosition.GetPositionAtOffset(linkTitle.Length)); 
link.IsEnabled = true; 
link.NavigateUri = new Uri(@"http://www.stackoverflow.com"); 

TextPointer positionAfterLink = link.ContentEnd.GetPositionAtOffset(1); 
if (!positionAfterLink.IsAtInsertionPosition) 
    positionAfterLink = caretPosition.GetInsertionPosition(LogicalDirection.Forward); 

richTextBox.CaretPosition = positionAfterLink; 

Таким образом, форматирование сохраняется. Но иногда CaretPosition не стоит за концом новой ссылки, но остается перед новой ссылкой. Кроме того, он не выглядит очень надежным для меня.

Неужели кто-то успешно это сделал? Каким будет правильный способ сделать это?

ответ

1

Я хотел бы изменить ваш первый code.The RichTextBox.Selection является TextRange, имеющий метод, называемый GetPropertyValue что позволяет получить некоторые свойства формата, такие как FontStyle, FontWeight, FontSize (и я думаю, что это достаточно). Таким образом, вы можете установить эти данные, достигнутый формат для вновь созданного Hyperlink:

TextPointer caretPosition = richTextBox.CaretPosition; 
TextPointer insertPosition = caretPosition.IsAtInsertionPosition ? 
    caretPosition : caretPosition.GetInsertionPosition(LogicalDirection.Forward); 
string linkTitle = "Stack Overflow"; 
//try getting some format info 
var fStyle = (FontStyle) richTextBox.Selection 
            .GetPropertyValue(Control.FontStyleProperty); 
var fWeight =(FontWeight)richTextBox.Selection 
            .GetPropertyValue(Control.FontWeightProperty); 
var fSize = (double)richTextBox.Selection 
           .GetPropertyValue(Control.FontSizeProperty); 
//create new link 
Run run = new Run(linkTitle); 
Hyperlink link = new Hyperlink(run, insertPosition); 
link.FontStyle = fStyle; 
link.FontWeight = fWeight; 
link.FontSize = fSize; 
//Remaining code ... 

Чтобы сделать ссылку иметь стиль по умолчанию (синий цвет и подчеркнуты), мы должны установить свойство RichTextBox в IsDocumentEnabled к истине. Также после вставки вы можете вызвать Focus() на RichTextBox.

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