Рисование поверх другого элемента управления - PullRequest
0 голосов
/ 19 января 2019

Microsoft Word позволяет отображать линии сетки в документе, как показано на снимке экрана:

enter image description here

Я пытаюсь создать это жеэффект внутри WPF RichTextBox.Я создал свой собственный элемент управления MyRichTextBox, полученный из RichTextBox, затем переопределил метод OnRender, чтобы просто нарисовать толстую линию для его проверки.Проблема в том, что моя линия рисуется под самим текстовым полем.Я вижу кусок этого торчащего в верхнем левом углу.Кто-нибудь есть какие-либо предложения о том, как я могу нарисовать линию внутри фактического текстового поля?Вот мой супер простой код:

public class MyRichTextBox : RichTextBox
{
    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        drawingContext.DrawLine(new Pen(Brushes.LimeGreen, 11.0), 
                new Point(1, 1), new Point(115, 115));
    }
}

1 Ответ

0 голосов
/ 21 января 2019

Вы можете определить пользовательский ControlTemplate и переопределить метод OnRender внутреннего ScrollViewer элемента RichTextBox:

public class MyScrollViewer : ScrollViewer
{
    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        drawingContext.DrawLine(new Pen(Brushes.LimeGreen, 11.0),
                new Point(1, 1), new Point(115, 115));
    }
}

XAML:

<RichTextBox>
    <RichTextBox.Resources>
        <SolidColorBrush x:Key="TextBox.Static.Border" Color="#FFABAdB3"/>
        <SolidColorBrush x:Key="TextBox.MouseOver.Border" Color="#FF7EB4EA"/>
        <SolidColorBrush x:Key="TextBox.Focus.Border" Color="#FF569DE5"/>
    </RichTextBox.Resources>
    <RichTextBox.Template>
        <ControlTemplate TargetType="{x:Type TextBoxBase}">
            <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                <local:MyScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsEnabled" Value="false">
                    <Setter Property="Opacity" TargetName="border" Value="0.56"/>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.MouseOver.Border}"/>
                </Trigger>
                <Trigger Property="IsKeyboardFocused" Value="true">
                    <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.Focus.Border}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </RichTextBox.Template>
</RichTextBox>
...