2015-06-08 1 views
1

Мне нужен текстовый элемент управления, где пользователь может редактировать текст и где некоторые части текста могут иметь разные цвета на основе текста. В принципе, представьте редактор исходного кода Visual Studio или любой другой редактор исходного файла, который окрасит исходный код. Что такое WPF-контроль? Ни один из трех вариантов в WPF я сознаю не не подходят:Текстовое управление WPF только с цветами

TextBox не позволяет цветам

TextBlock не позволяет пользователям редактировать текст

RichTextBox позволяет слишком много - я просто хочу цвета.

Возможно, RichTextBox может фиксировать другие текстовые форматы (т. Е. Шрифты, полужирный, курсив)? Есть предположения?

+1

Текстовый редактор Visual Studio не является стандартным элементом управления. Таким образом, вы можете искать сторонний элемент управления или создавать его самостоятельно. –

ответ

1

Эта функция не находится ни в одном из элементов управления текстом. Возможно, вы можете написать собственный собственный контроль, наследуя RichTextBox.

1

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

Например: wpfsyntax

WPF Синтаксис Выделите Textbox очень простое управление для редактирования исходного кода. Содержит нумерацию строк, выделение мира, отступы (вкладка, сдвиг + вкладка ....) и многое другое. В тестовом приложении содержится парсер для языка IronPython и Boo. Синтаксис Highlight Textbox разработан на C#.

Или: Fast colored textblox

Для одного из моих проектов, я почувствовал необходимость текстового редактора с подсветкой синтаксиса. Сначала я использовал компонент, унаследованный от RichTextBox, но, используя его для большого количества текста, я обнаружил, что RichTextBox очень медленно выделяет большое количество цветных фрагментов (от 200 и более). Когда такая подсветка должна выполняться динамически, это создает серьезную проблему.
Поэтому я создал свой собственный текстовый компонент, который не использует ни текстовые файлы Windows, ни RichTextBox.

4

Вот (очень) грубый пример держать палку с TextBox и TextBlock: просто для удовольствия, но стоит ...

enter image description here

Вот XAML ...

<Grid> 
    <TextBlock 
     x:Name="Tx1" 
     HorizontalAlignment="{Binding Path=HorizontalAlignment, ElementName=Tb1}" 
     VerticalAlignment="{Binding Path=VerticalAlignment, ElementName=Tb1}" 
     Margin="{Binding Path=Margin, ElementName=Tb1}" 
     FontSize="{Binding Path=FontSize, ElementName=Tb1}" 
     /> 

    <TextBox 
     x:Name="Tb1" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Center" 
     Margin="100,0" 
     FontSize="24" 
     Background="Transparent" 
     Foreground="Transparent" 
     TextChanged="Tb1_TextChanged" 
     /> 
</Grid> 

... а вот какой-то код ...

private void Tb1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     var inlines = this.Tx1.Inlines; 
     inlines.Clear(); 

     foreach (char ch in this.Tb1.Text) 
     { 
      if (Char.IsDigit(ch)) 
      { 
       var run = new Run(ch.ToString()); 
       run.Foreground = Brushes.Blue; 
       inlines.Add(run); 
      } 
      else if (Char.IsLetter(ch)) 
      { 
       var run = new Run(ch.ToString()); 
       run.Foreground = Brushes.Red; 
       inlines.Add(run); 
      } 
      else 
      { 
       var run = new Run(ch.ToString()); 
       run.Foreground = Brushes.LimeGreen; 
       inlines.Add(run); 
      } 
     } 
    } 

Задача состоит в использовании прозрачного TextBox над в TextBlock, который может быть окрашен, собирая много различных элементов Run.

+1

Это работает отлично, но два запуска не совпадают с несколькими линиями. Вы знаете, как решить эту проблему? –

+0

Хорошая добыча! Позвольте мне найти время! –

+0

У вас появилась возможность заглянуть в нее? –