我在Silverlight 4中为RichTextBox创建了一个突出显示机制。它将获取字符位置并在文本上绘制矩形。
我现在遇到的麻烦是滚动RichTextBox。滚动时,我所有珍贵的突出显示都被遗忘了。有没有什么办法可以将事件处理程序添加到RichTextBox的滚动事件和/或滚动位置?或者是否有更好的方法可以将突出显示矩形的位置链接到RichTextBox?
答案 0 :(得分:2)
诀窍是获得覆盖RichTextBox的所有面板(我猜它是Canvas?)实际上存在于富文本所在的ScrollViewer
内。
以下是非常粗略的想法,但应该让你走上合理解决方案的道路。
您可以使用RichTextBox
的自定义样式执行此操作。可以在here找到此控件的默认样式。
将此样式复制到包含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
。拥有一个名为“ContentElement”的FrameworkElement
是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
方法的来源,here。
答案 1 :(得分:0)
Anthony W Jones提出了一个出色的解决方案。我不得不对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。