DX(DevExpress)RichEditControl 控件 生成导航栏,点击定位到文本

DX(DevExpress)RichEditControl 控件 生成导航栏,点击定位到文本

核心代码:

     private void CreateNavigator()
        {
            if (m_Doc == null) return;
            var Paragraphs = m_Doc.Paragraphs;

            var DicLevelAndLastNode = new Dictionary<int, TreeCustomItem>();

            var lstTree = new ObservableCollectionCore<TreeCustomItem>();
            var RootNode = new TreeCustomItem
            {
                Header = "导航栏",
                Parent = null,
                IsExpand = true,
                Tag = m_Doc.DocumentProperties.Title
            };
            DicLevelAndLastNode.Add(0, RootNode);


            foreach (var pg in Paragraphs)
            {
                var Text = m_Doc.GetText(pg.Range);
                var Level = pg.OutlineLevel;
                if (Level < 1)
                    continue;

                if (!DicLevelAndLastNode.ContainsKey(Level - 1))
                {
                    ControlUtility.ShowWarningMsgbox($"本文档大纲级别存在跳级错误,如一级大纲下为三级、四级大纲,无法生成导航栏,建议检查文档");
                    return;
                }

                var ParentNode = DicLevelAndLastNode[Level - 1];
                var Node = new TreeCustomItem
                {
                    Tag = pg,
                    Header = Text,
                    //IsExpand = true,
                    Parent = ParentNode
                };
                ParentNode.Childrens.Add(Node);

                if (!DicLevelAndLastNode.ContainsKey(Level))
                    DicLevelAndLastNode.Add(Level, Node);
                else
                    DicLevelAndLastNode[Level] = Node;
            }
            lstTree.Add(RootNode);
            treeNav.SelectedItemChanged += new SelectedItemChangedEvent(ucTreeView_SelectedItemChanged);
            treeNav.ContextMenuOpening += new ContextMenuEventHandler(ucTreeView_CreateContextMenu);
            treeNav.BuildHierarchicalDataTemplate(typeof(TreeCustomItem), "Childrens", "Header", null, "Header");
            treeNav.BindingTreeViewData(lstTree);
        }
其中,最主要的是要自己生成一个Tree的实体类,要求有Parent、Children、Tag属性,然后可以绑定在TreeView中。读取Doc文本的时候,按照段落读取,每一段有一个大纲级别,然后把大纲级别>=1的加进左侧的TreeView中。(0级为正文文本)
最后是点击事件,导航:
    if (selectedItem == null) return;
    var Node = selectedItem as TreeCustomItem;
    if (Node == null) return;
    var pg = Node.Tag as Paragraph;
    if (pg == null) return;
    rbxDoc.Document.CaretPosition = pg.Range.Start;
    //rbxDoc.ScrollToCaret();
    rbxDoc.ScrollToCaret(0);
获得当前节点的Tag,即对于的段落实体。然后设置CaretPosition为段落的起始位置。rbxDoc.ScrollToCaret()这个函数,有时候会定位到最上方,有时候会定位到最下方,十分不方便。他的重载里有一个带参数的形式。

这里写图片描述

字面意思上理解就是滚动到光标时,显示在第几行。传入参数0,就是在最上方,完美解决了定位有时候在文档上方,有时候在文档下方的问题。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

话与山鬼听

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值