FlowDocument расширяет предыдущий прогон вместо создания нового
Я работаю над пользовательским элементом управления, который имеет дело со стилями выделения текста, я столкнулся с проблемой, где:
- Введите текст "Это куча текста" в мой контроль
- Подсветка "текста"
- Делайте то, что меняет стиль выделения
- Нажмите пробел (или введите букву) - стиль продолжается, когда он должен быть без стиля
Внутренне, я полагаю, что это разделяет FlowDocument на 2 отдельных "Прогона", 1 прогон "Это куча" и 2 прогон "текст"
Однако, когда я нажимаю пробел после стиля, он просто расширяет Run 2, изменяя стиль (это серьезная проблема)
Я попытался вставить пустой документ в конец документа с помощью следующего:
new Run(String.Empty, Selection.End);
Однако, это не работает, и второй запуск все еще изменен...
Одним из способов решения этой проблемы является следующее:
new Run(" ", Selection.End);
Однако если я вручную переместу курсор до конца стиля и нажму пробел, он все равно продолжит стиль:(
Я немного в конце своей привязи с этим, если кто-то может предложить какое-либо руководство, это было бы очень признательно.
Для всех, кто интересуется, вот источник для ICommand в контекстном меню (который применяет стиль)
private void TagSelection(object tagType)
{
var type = tagType as TagType;
var textRange = new TextRange(Selection.Start, Selection.End)
{
Text = Selection.Text
};
switch (type.Id)
{
case (int) TagTypeEnum.AllergenContains:
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.MediumSeaGreen));
textRange.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
break;
case (int)TagTypeEnum.AllergenMayContain:
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.SteelBlue));
textRange.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
break;
case (int)TagTypeEnum.AllergenAsOnPack:
textRange.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.Moccasin));
break;
}
}
1 ответ
Для тех, кто сталкивается с этим и интересуется, решится ли это когда-нибудь, я нашел решение:
Я добавил событие в событие TextChanged:
private void TaggableTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextChanged -= TaggableTextBox_TextChanged;
ReprocessTags();
}
private void ReprocessTags()
{
//Remove all tags, and re-process
RemoveAllTags();
ProcessTags();
}
private void RemoveAllTags()
{
var textRange = new TextRange(Document.ContentStart, Document.ContentEnd);
textRange.ClearAllProperties();
}
private void ProcessTags()
{
if (Tags == null)
return;
foreach (var tag in Tags.ToArray())
{
TagRegion(tag.Start, tag.Length, tag.Type);
}
}
private void TagRegion(int index, int length, TagType type)
{
var start = GoToPoint(Document.ContentStart, index);
var end = GoToPoint(start, length);
TagSelection(type, start, end);
}
Это требует очистки, но в основном я очищаю все форматирование в FlowDocument, а затем перерабатываю их, эффективно создавая новые прогоны, поэтому решая проблему.
Надеюсь, это кому-нибудь поможет!