WPF学习笔记-FlowDocument流文档基础知识和基本操作

文章目录

  • 概述
  • 一、块元素和内联元素
  • 1.1 块元素(Block类)
  • 1.2 内联元素(Inline类)
  • 二、Paragraph元素
    • 2.1 基本属性设置
    • 2.2 将内联元素Inline添加到Inlines中
    • 2.3 设置中西文字体不一样
  • 三、Table元素
    • 3.1 添加新的Table
    • 3.2 添加列
    • 3.3 添加行
    • 3.4 设置隔行不同颜色
  • 总结

天踦爵
诗号:三年寻龙,十年点穴,肩负青囊走南北;三寸知息,十面洞心,掌握乾坤通天阙。
在这里插入图片描述

概述

WPF中提供了FlowDocument类,用于高级文档功能(如分页和列)承载流内容和设置流内容格式,可以根据自己的需要进行在线编辑,是自定义显示样式,展示大段文章的绝佳利器。
FlowDocument的默认值DataTemplateFlowDocument包含一个 FlowDocumentReader ,如果使用 作为 XAML 文件中的根元素,则用于FlowDocument显示文档。
如果 FlowDocument 不是根元素,则可以在 、 FlowDocumentPageViewer或 FlowDocumentReader 控件中FlowDocumentScrollViewer显示文档。
还可以在 控件中RichTextBox编辑 FlowDocument 。

一、块元素和内联元素

1.1 块元素(Block类)

FlowDocument 为子内容强制实施强内容模型。 中包含的 FlowDocument 顶级子元素必须派生自 Block。 有效的顶级子元素包括:

  • BlockUIContainer
  • List
  • Paragraph
  • Section
  • Table

1.2 内联元素(Inline类)

为所有内联流内容元素提供基类的抽象类,有效的子元素包括:

  • Bold
  • Figure
  • Floater
  • Hyperlink
  • InlineUIContainer
  • Italic
  • LineBreak
  • Run
  • Span
  • Underline

二、Paragraph元素

Paragraph是段落,可以承载其他的Inline元素。一个段落按照一个新行开始添加。

2.1 基本属性设置

  • Background:背景颜色
  • BorderBrush:边框颜色
  • BorderThickness:边框线条
  • FontFamily:字体
  • FontSize:字体大小
  • FontStretch:字体拉伸特性
  • FontStyle:字体样式
  • FontWeight:字体粗细
  • Foreground:字体颜色
  • Inlines:内联元素集合
  • TextAlignment:文本对齐方式
  • ToolTip:提示对象

2.2 将内联元素Inline添加到Inlines中

	Inline inline = new Run();paragraph.Inlines.Add(inline); // 添加内联元素

2.3 设置中西文字体不一样

//					西文字体	中文字体
FontFamily("Times New Roman,楷体");

开发文档中是这样介绍的:指定多个字体系列名称的字符串,每个名称用逗号分隔 (逗号后的任何空格将被忽略) 。 指定的第一个字体系列用作主要字体系列;后续字体系列用作回退系列,用于主要字体系列不可用或不适用的情况。 例如, “Arial, Century Gothic” 指定 Arial 作为主要字体系列,将 Century 哥特作为回退字体系列。
而设置中西文,我们需要将西文字体设置在前面,这样自当匹配到中文之后,就会采用第二个设置的中文字体,如果将中文字体放前面,那就会无法显示西文字体,因为中文字体中一般西文也有,而西文字体中很少有中文。

三、Table元素

Table元素类似于Grid元素,但是具体有更多的功能,总体来说Table元素非常接近于word中的表格,但是有一点就是没有垂直居中功能,有需要垂直居中的话需要另行处理。

3.1 添加新的Table

public static Table AddTable(FlowDocument flowDocument, double cellSpacing = 0)
{Table table = new Table();table.BorderThickness = new Thickness(0, 1, 0, 0);table.BorderBrush = new SolidColorBrush(Colors.Black);table.CellSpacing = cellSpacing;table.Margin = new Thickness(0, 5, 0, 10);flowDocument.Blocks.Add(table);return table;
}

3.2 添加列

        /// <summary>/// 添加列/// </summary>public static void AddColumn(Table table, uint colCnt){if (table == null) return;for (int i = 0; i < colCnt; i++){TableColumn column = new TableColumn();table.Columns.Add(column);}}

3.3 添加行

Table需要保证至少有一个TableRowGroup的情况才能添加行数据,向其中添加行组合,然后将行添加到行组合中。

        public static void AddRow(TableRowGroup rowGroup, params object[] datas){if (rowGroup == null || datas == null) return;TableRow row;TableCell cell;// row.row = new TableRow();rowGroup.Rows.Add(row);for (int i = 0; i < datas.Length; i++){cell = new TableCell();cell.BorderThickness = new Thickness(0, 0, 0, 1);cell.BorderBrush = new SolidColorBrush(Colors.Black);cell.TextAlignment = TextAlignment.Center;row.Cells.Add(cell);BlockUIContainer blockUIContainer = new BlockUIContainer();cell.Blocks.Add(blockUIContainer);Grid grid = new Grid();TextBlock textBlock = new TextBlock();textBlock.VerticalAlignment = VerticalAlignment.Center;textBlock.TextAlignment = TextAlignment.Center;textBlock.HorizontalAlignment = HorizontalAlignment.Center;grid.Children.Add(textBlock);blockUIContainer.Child = grid;if ((datas[i] as Paragraph) == null){textBlock.Inlines.Add(Convert.ToString(datas[i]));}else{textBlock.Inlines.AddRange((datas[i] as Paragraph).Inlines);}}}

3.4 设置隔行不同颜色

Table本身并没有直接实现隔行不同颜色,但是可以通过遍历行,对不同行进行颜色设置实现该功能。

        /// <summary>/// Set table color./// </summary>/// <param name="table"></param>public static void SetTableColor(Table table,SolidColorBrush mainBrush, SolidColorBrush underBrush){if (table == null){return;}for (int i = 0; i < table.RowGroups.Count; i++){for (int rowIndex = 0; rowIndex < table.RowGroups[i].Rows.Count; rowIndex++){table.RowGroups[i].Rows[rowIndex].Background = rowIndex % 2 == 0 ? mainBrush : underBrush;}}}

总结

FlowDocument是WPF高级文档显示功能,可以满足大部分的功能实现,以上只是简单的说明和使用,具体还有很多的功能可供开发学习。持续学习,持续成长。加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习系列-python实现-初步学习构建神经网络

深度学习系列-python实现-初步学习构建神经网络 前言1.在Keras中加载MNIST数据集2.构建简单的神经网络模型3.训练模型4.模型的预测和评估5.总结 前言 在数字时代&#xff0c;数据已经成为了一种无处不在的资源。从商业分析到科学研究&#xff0c;从人工智能到机器学习&#xf…

固态硬盘一年不通电数据就没了吗?丢失了怎么办

随着数字化时代的到来&#xff0c;数据的安全性和持久性变得尤为重要。作为现代电子设备中常见的存储设备&#xff0c;固态硬盘&#xff08;SSD&#xff09;以其高效、快速的特点受到广大用户的青睐。然而&#xff0c;有关固态硬盘长时间不通电后数据会丢失的担忧也时常困扰着用…

报错:AttributeError: module ‘numpy‘ has no attribute ‘unit8‘解决

错误问题&#xff1a; 解决方法&#xff1a; 哥们姐们仔细一点吧这个unit8是打错了&#xff0c;无非就是uint8写成了unit8 应该是【uint8】&#xff0c;以后敲代码仔细点哦

从零开始学数据分析之数据分析概述

当今世界对信息技术的依赖程度在不断加深&#xff0c;每天都会有大量的数据产生&#xff0c;我们经常会感到数据越来越多&#xff0c;但是要从中发现有价值的信息却越来越难。 这里所说的信息&#xff0c;可以理解为对数据集处理之后的结果&#xff0c;是从数据集中提炼出的可用…

【Leetcode】top 100 二分查找

35 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。 基础写法&#xff01;&#xff01;&#xff01;牢记…

清华学霸引爆“长文本”大战,大模型的应用前景清晰了吗?

文 | 智能相对论 作者 | 沈浪 Long-LLM&#xff08;长文本大模型&#xff09;时代似乎来得有些突然&#xff0c;而引爆这场热潮的&#xff0c;竟是一家由清华学霸牵头的本土AI初创企业。 前不久&#xff0c;月之暗面&#xff08;Moonshot AI&#xff09;公司宣布旗下对话式 …

linux 环境安装配置

安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…

金三银四面试题(十):Java基础问题(1)

这部分面试题多用于面试的热身运动&#xff0c;对很多找实习和准备毕业找工作的小伙伴至关重要。 访问修饰符 在 Java 中&#xff0c;提供了四种访问权限控制&#xff1a; public private protected 以及什么都不写&#xff08;default&#xff09; 修饰符当前类同包子包其他…

SSM学习——Spring AOP与AspectJ

Spring AOP与AspectJ 概念 AOP的全称为Aspect-Oriented Programming&#xff0c;即面向切面编程。 想象你是汉堡店的厨师&#xff0c;每一份汉堡都有好几层&#xff0c;这每一层都可以视作一个切面。现在有一位顾客想要品尝到不同风味肉馅的汉堡&#xff0c;如果按照传统的方…

【java】关于String、StringBuffer和StringBuilder的那些事

在之前的文章中我们曾简单介绍过String这个引用类型变量&#xff0c;其实它还有许多特性&#xff0c;还有StringBuffer和StringBuilder这两个方法在字符串操作中也有非常重要的地位&#xff0c;接下来就由小编带大家梳理一下吧&#x1f44a; 目录 一、String 1、构造方法 2、…

独立开发者用微信小程序赚钱

微信小程序能实现赚钱&#xff0c;赚多赚少的问题。 本人就上线了一款小程序 &#xff0c;集结者assemble &#xff0c;现在上了广告了&#xff0c;收益不是很多&#xff0c;但胜在持续&#xff0c;税后收入&#xff0c;也还在持续推广中。 开发小程序赚大钱得找到变现模式&a…

0基础学习Mybatis系列数据库操作框架——目录结构

大纲 配置的修改代码的修改Main.java文件所在包下新增org.example.model包新增org.example.mapper包 单元测试 在《0基础学习Mybatis系列数据库操作框架——最小Demo》一文中&#xff0c;我们用最简单的方法组织出一个Mybatis应用项目。为了后续构建更符合日常开发环境的项目&a…

归并排序和分治

归并排序 归并排序是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治策略&#xff08;分治法将问题分成一些小的问题然后递归求解&#xff0c;而治的阶段则将分的阶段得到的各答案"修补"在一起&#xff0c;即分而治之)。 分而治之 可以看到这种结构…

书生浦语全链条开源开放体系

开放了高质量语料数据 预训练 微调 评测 评测框架 部署 智能体 例如把openlab对于计算机视觉的封装

LeetCode-894. 所有可能的真二叉树【树 递归 记忆化搜索 动态规划 二叉树】

LeetCode-894. 所有可能的真二叉树【树 递归 记忆化搜索 动态规划 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;分治&#xff0c;递归解题思路二&#xff1a;动态规划。关键思路是如果构造节点数目为 n 的真二叉树&#xff0c;此时可以从节点数目序列为 [(1,n−2),(3,…

Linux网络编程二(TCP图解三次握手及四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

文章目录 1、TCP三次握手(1) 第一次握手(2) 第二次握手(3) 第三次握手 2、TCP四次挥手(1) 一次挥手(2) 二次挥手(3) 三次挥手(4) 四次挥手 3、TCP滑动窗口4、TCP状态时序图5、多进程并发服务器6、多线程并发服务器 1、TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协…

选择SD-WAN带宽时需要考虑什么?

部署SD-WAN之前&#xff0c;企业需要考虑关系到带宽大小的一系列因素&#xff0c;以确保其网络能够满足业务需求并保持高效运行。以下是一些在确定SD-WAN带宽时需要考虑的关键因素&#xff1a; 企业规模和用户数量&#xff1a; 企业规模和用户数量是决定带宽需求的重要因素之一…

Vue的前世今生与安装配置

vue的前世今生 Vue.js是一个流行的前端JavaScript框架&#xff0c;用于构建用户界面与单页应用程序&#xff08;SPA&#xff09;。它的诞生和发展可以概括为以下几个重要阶段&#xff1a; 初创阶段&#xff1a;Vue由中国人尤雨溪&#xff08;Evan You&#xff09;创建于2014年…

人工智能聊天机器人都有哪些?分享3款神奇的软件!

在数字化浪潮中&#xff0c;人工智能聊天机器人以其独特的魅力和实用性&#xff0c;逐渐成为我们生活中不可或缺的一部分。它们能够与用户进行智能互动&#xff0c;提供多元化的服务&#xff0c;让我们的生活更加便捷和高效。那么&#xff0c;市场上究竟有哪些领先的人工智能聊…

智能停车场物联网远程监控解决方案

智能停车场物联网远程监控解决方案 智能停车场物联网远程监控解决方案是一种集成了现代物联网技术、大数据分析以及云计算等先进技术手段&#xff0c;对停车场进行全面智能化管理的综合系统。它通过实时感知、精准采集和高效传输各类停车数据&#xff0c;实现对停车场运营状态…