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, а затем перерабатываю их, эффективно создавая новые прогоны, поэтому решая проблему.

Надеюсь, это кому-нибудь поможет!

Другие вопросы по тегам