从RichTextBox获取滚动位置?

时间:2010-09-05 18:14:22

标签: silverlight silverlight-4.0 scroll richtextbox

我在Silverlight 4中为RichTextBox创建了一个突出显示机制。它将获取字符位置并在文本上绘制矩形。

我现在遇到的麻烦是滚动RichTextBox。滚动时,我所有珍贵的突出显示都被遗忘了。有没有什么办法可以将事件处理程序添加到RichTextBox的滚动事件和/或滚动位置?或者是否有更好的方法可以将突出显示矩形的位置链接到RichTextBox?

2 个答案:

答案 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。