Получить позицию прокрутки из RichTextBox? - PullRequest
2 голосов
/ 05 сентября 2010

Я создал механизм подсветки для RichTextBox в Silverlight 4. Он будет определять положение символов и рисовать прямоугольники над текстом.

Проблема, с которой я столкнулся сейчас, заключается в прокрутке RichTextBox,Когда я прокручиваю, все мои драгоценные выделения остаются позади.Есть ли способ добавить обработчик события к событию прокрутки и / или к позиции прокрутки RichTextBox?Или есть какой-то лучший способ, которым я могу связать положение выделенных прямоугольников с RichTextBox?

Ответы [ 2 ]

2 голосов
/ 06 сентября 2010

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

0 голосов
/ 06 сентября 2010

Энтони У Джонс предложил блестящее решение. Мне нужно было сделать всего пару настроек XAML.

Как и предполагалось, я начал с этого внутри шаблона:

<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>

Но ContentControl все испортил, и вы больше не можете печатать в RichTextBox. Кроме того, полосы прокрутки не отображаются.

Но я нашел два изменения, необходимые для этой работы:

<Border x:Name="MouseOverBorder" BorderBrush="Transparent" BorderThickness="1">
    <ScrollViewer BorderThickness="0" IsTabStop="False" Padding="{TemplateBinding Padding}" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Grid>
            <Grid x:Name="ContentElement" />
            <Canvas x:Name="HighlightOverlay" />
        </Grid>
    </ScrollViewer>
</Border>

Добавление HorizontalScrollBarVisibility="Auto" и VerticalScrollBarVisibility="Auto" вернуло полосы прокрутки назад, и простое использование Grid вместо ContentControl сделало RichTextBox снова редактируемым.

...