WPF开发txt阅读器3:目录控件

news/2024/11/29 6:44:48/

文章目录

    • 目录提取
    • 列表控件
    • 整改

txt阅读器系列:

  • 需求分析和文件读写
  • 目录提取类💎列表控件与目录

目录提取

在实现标题类之后,就可以实战演习一番。首先在mainWindow中添加Catalog

public Catalog catalog;

然后更改

然后在标题栏中添加目录按钮,并绑定btnCatalog_Click事件,其内容为

private void btnCatalog_Click(object sender, RoutedEventArgs e)
{if (txt.Text.Length == 0)return;catalog = new Catalog(txt.Text, true);
}

当然,生成目录的方法最终一定要设置为可选参量,但目前作为功能测试阶段,可以直接根据我们用来测试的文本文档来直接确定,选择true

然后为了验证这种查找目录方法的可靠性,在右侧栏中添加一个TextBox,名为txtInfo,然后将生成的目录添加到txtInfo中,从而完整的btnCatalog_Click如下

private void btnCatalog_Click(object sender, RoutedEventArgs e)
{if (txt.Text.Length == 0)return;catalog = new Catalog(txt.Text, true);foreach (var item in catalog.secs)txtInfo.AppendText($"{item.title}\r\n");
}

效果为

在这里插入图片描述

很明显这里出现了一个bug,即序言作为目录被挑选了两次,为了避免这种情况,为Catalog类添加一个新的判定方法

public bool Contains(string title)
{foreach (var sec in secs)if(sec.title == title.Trim())return true;return false;
}

并在extractCatalog中添加

if (Contains(p))break;

列表控件

将目录打印出来其实并没有什么用,我们的目的是点击目录然后可以跳转,一个比较直接的方案是,把目录映射到一个列表控件中。故而在左下角的ScollViewer中添加一个
<ListBox x:Name="lvCatalog"/>,然后修改btnCatalog_Click,内容变为下面这样

private void btnCatalog_Click(object sender, RoutedEventArgs e)
{if (txt.Text.Length == 0)return;catalog = new Catalog(txt.Text, true);lvCatalog.Items.Clear();foreach (var item in catalog.secs)lvCatalog.Items.Add(item.title);
}

其中,lvCatalog.Items.Clear()用于清空列表,然后下面会循环填入目录的标题。

最后,就是真正实现目录导航功能的关键,注册列表控件的点击事件,然后调用生成好的目录进行跳转

private void lvCatalog_SelectionChanged(object sender, SelectionChangedEventArgs e)
{int i = lvCatalog.SelectedIndex;int ed = (i+1) < catalog.secs.Count ? catalog.secs[i + 1].location : doc.Length;txt.Text = doc[catalog.secs[i].location..ed];txt.ScrollToHome();
}

最后效果如下

在这里插入图片描述

整改

目前尽管已经实现了基本功能,但是有一个尴尬的问题,即目录跳转过程中,直接把目录本身跳过去了。为此,可修改Catalog类的extractCatalog方法——新建标题之前,先添加一个目录标题。

public void extractCatalog(string txt)
{int i = 0, num = 0;     //i是章节号;num是章节位置secs.Add(new Section(i++, "目录", 0));foreach (var p in txt.Split("\r\n")){num += p.Length;if (p.Trim().Length == 0)continue;if (!isSection(p))break;if (Contains(p))break;secs.Add(new Section(i++, p, txt, num * 2));}
}

http://www.ppmy.cn/news/272899.html

相关文章

联通光猫电视盒配置

前言 记录一下联通光猫电视盒子配置。 电视盒子配置 这里我绑定的是 LAN3 接口&#xff0c;所以电视盒子需要插入第三个接口。 网络配置 网络连接设置&#xff0c;我不想用路由器往下分配子网&#xff0c;所以这里绑定了两个接口&#xff1a;LAN1&#xff0c;LAN2。 这样可以…

LT2611UXC功能LVDS转HDMI2.0,适用于机顶盒和DVD应用

1. 描述 LT2611UXC 是一款高性能 LVDS 至 HDMI2.0 转换器&#xff0c;适用于机顶盒和 DVD 应用。 LVDS输入可配置为单端口或双端口&#xff0c;具有1个高速时钟通道&#xff0c;3~4个高速数据通道&#xff0c;最大工作速率为1.2Gbps/通道&#xff0c;可支持高达9.6Gbps的总带宽…

激光切割机价格是怎样的

​激光切割加工取代部分机械冲床的趋势没有改变&#xff0c;特别是过去三年激光设备大幅降价突破了加工用户的成本利润临界点&#xff0c;许多用户购买激光切割机&#xff0c;现在也导致激光加工厂遍地开花&#xff0c;OEM薪酬也降低了很多&#xff0c;原来切工件十元&#xff…

拆机解析】三款旗舰深度拆解,最贵电视盒子内部长这样!

原网址 https://www.chinaz.com/2020/0514/1134694.shtml 5年的玩机经验让我经历了不少的劣质电视盒子&#xff0c;质量奇差令人触目惊心&#xff0c;想必大家也看到过&#xff0c;媒体报道劣质盒子爆炸的事情&#xff0c;这一类电视盒子通常的手段就是在参数配置上弄虚作假&a…

虹科分享 | 波长选择器:光电检测场景中的利器

波长选择器&#xff0c;即单色仪&#xff0c;是一种能够自动调节或手动调节输出波长的分光仪器。在光谱分析和光谱特性测量过程中&#xff0c;波长选择器的原理是借助光栅、滤光片、声光衍射等分光元件输出一系列独立的、光谱区间足够窄的单色光&#xff0c;且所输出单色光的波…

激光摄像机的原理及应用

近年来&#xff0c;在安防监控领域&#xff0c;以目前视频监控技术的发展情况&#xff0c;室内监控和白天正常环境下的监控已不是难题&#xff0c;但社会环境的发展日新月异&#xff0c;城市的发展、森林资源的不断流失、大型项目的建设、边防安全的守护等&#xff0c;这些环境…

ICV光子盒:2023全球量子计算产业发展展望

近日&#xff0c;全球著名的前沿科技咨询机构ICV与国内专注量子领域的行业研究机构光子盒&#xff0c;联合发布了2023全球量子计算产业发展展望&#xff0c;为量子计算行业的决策者、投资者和政策制定者提供了宝贵的见解&#xff0c;帮助其紧跟量子计算的最新发展&#xff0c;并…

知名激光雷达品牌及价格行情

在业内提到机器人用激光雷达&#xff0c;相信大部分人首先想到的便是思岚科技&#xff0c;思岚科技是我国最早从事机器人自主定位导航技术的企业&#xff0c;在机器人定位导航领域已有多年研发及实践经验&#xff0c;目前&#xff0c;思岚科技已拥有激光雷达、定位导航系统及机…