代码之家  ›  专栏  ›  技术社区  ›  Steve Wortham

从RichTextBox获取滚动位置?

  •  2
  • Steve Wortham  · 技术社区  · 15 年前

    我现在的问题是在RichTextBox上滚动。当我滚动时,我所有珍贵的突出显示都被留下了。有什么方法可以将事件处理程序添加到滚动事件和/或RichTextBox的滚动位置吗?或者有没有更好的方法将高亮显示矩形的位置链接到RichTextBox?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    ScrollViewer 富格文本存在于。

    以下是非常粗略的想法,但应该让你的道路上合理的解决方案。

    RichTextBox . 可以找到此控件的默认样式 here

    将此样式复制到包含UserControl的资源中,并指向 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>
    

    滚动条 到新的 ContentControl FrameworkElement 名为“ContentElement”是RichTextBox对其模板规定的唯一特性。

    内容控制 我们可以在 Canvas 您可以放置突出显示矩形的位置。如果用户滚动此 多格式文本框 整个 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 .

        2
  •  0
  •   Steve Wortham    15 年前

    安东尼W琼斯想出了一个绝妙的解决办法。我只需要对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>
    

    <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再次可编辑。

    推荐文章