c# - 在另一个控件上绘图
问题描述
Microsoft Word 允许您在文档上显示网格线,如下面的屏幕截图所示:
我正在尝试在 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));
}
}
解决方案
您可以定义一个自定义ControlTemplate
并覆盖内部元素的OnRender
方法:RichTextBox
ScrollViewer
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>
推荐阅读
- ios13 - iOS 13 Xcode UI 测试自动化类型不匹配
- security - 如何将静态文件的访问权限限制为特定的登录用户?
- ios - 如何在 Swift UI 中实现本地化
- flutter - 如何检测带有颤动/火焰的游戏中的滑动
- c++ - 通过终端在文件中输入时检测 EOF(文件结尾)的问题
- vue.js - vue-router 和 from 有什么区别:to
- java - 删除数据库中间的一些行后,有什么方法可以滚动 SQL 中的所有行?
- swift - SwiftUI 中的动态 NavigationLink 目的地?
- python - 如何更改我的数据以使其与损失一起工作:均方误差?
- mysql - Mysql 使用 LOAD DATA 创建数百万行的问题