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

来源:互联网 发布:重庆网络审批平台 编辑:程序博客网 时间:2024/05/20 18:49

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 0
原创粉丝点击