Хитрость заключается в том, чтобы получить какую-либо панель (я полагаю, это Canvas?), С которой вы накладываете RichTextBox, чтобы фактически существовать в том же ScrollViewer
, в котором существует форматированный текст.
Это очень грубая идея, но она поможет вам найти разумное решение.
Вы можете сделать это, используя собственный стиль для RichTextBox
.Стиль по умолчанию для этого элемента управления можно найти здесь .
Скопируйте этот стиль в ресурс в вашем содержащем UserControl и укажите на нем свойство RichTextBox
Style
.Пока ничего не изменилось, но теперь вы можете поиграть с шаблоном.Соответствующая часть в настоящее время выглядит следующим образом: -
<Border x:Name="MouseOverBorder" BorderThickness="1" BorderBrush="Transparent">
<ScrollViewer x:Name="ContentElement" Padding="{TemplateBinding Padding}" BorderThickness="0" IsTabStop="False" />
</Border>
Теперь мы можем настроить его следующим образом: -
<Border x:Name="MouseOverBorder" BorderThickness="1" BorderBrush="Transparent">
<ScrollViewer Padding="{TemplateBinding Padding}" BorderThickness="0" IsTabStop="False">
<Grid>
<ContentControl x:Name="ContentElement" />
<Canvas x:Name="HighlightOverlay" />
</Grid>
</ScrollViewer>
</Border>
Вы заметите, что мы переместили название «ContentElement»от ScrollViewer
до нового ContentControl
.FrameworkElement
с именем «ContentElement» - единственная функция, которую RichTextBox предусматривает в отношении своего шаблона.
Теперь, наложив этот ContentControl
, мы можем поместить Canvas
, где вы можете разместить свои подсвечивающие прямоугольники.Если пользователь прокручивает этот RichTextBox
, то все Grid
, содержащее и содержимое, и основные моменты, будут прокручиваться вместе.
Единственный оставшийся трюк - это получение HighlightOverlay, чтобы вы могли добавить к нему свой прямоугольник.Вот некоторый код, который его захватит: -
private Canvas HightlightOverlay;
public MyUserControl()
{
InitializeComponent();
MyRichText.LayoutUpdated += MyRichText_LayoutUpdated;
}
void MyRichText_LayoutUpdated(object sender, EventArgs e)
{
HightlightOverlay = MyRichText.Descendents()
.OfType<Canvas>()
.FirstOrDefault(elem => elem.Name == "HighlightOverlay");
}
Вам будет интересно, откуда взялся метод Descendents
, он здесь .