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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

采用C#.net6.0+Vue,Ant-Design技术开发的一套大型医院手术麻醉信息系统源码,系统成熟,运行稳定

手术麻醉信息系统源码&#xff0c;C#手麻系统源码&#xff0c;自主版权应用案例&#xff08;适合上项目&#xff09; 手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集&#xff0c;采集的数据能据如实准确地反映患者生命体征参数的变化&…

前端、后端上传文件到OSS,简明记录

前端、后端上传文件到OSS&#xff0c;简明记录 上传文件到oss的方式&#xff1a; **后端上传&#xff1a;**文件先要从页面上传到后端存起来&#xff0c;再通过后端发送到oss&#xff0c;然后后端将存起来的文件删除&#xff08;当然可以不删&#xff09;。 **前端上传&…

Unix 网络编程, Socket 以及bind(), listen(), accept(), connect(), read()write()五大函数简介

Unix网络编程是针对类Unix操作系统&#xff08;包括Linux、BSD以及其他遵循POSIX标准的操作系统&#xff09;进行网络通信开发的技术领域。网络编程涉及创建和管理网络连接、交换数据以及处理不同层次网络协议栈上的各种网络事件。在Unix环境中&#xff0c;网络编程通常涉及到以…

华为ensp中ospf多区域管理 原理及配置命令(详解)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; ————前言———— OSPF 多区域的主要作用是缩小链路状态数据库和路由表的规模&#xff0c;减少路由更新的频率&#xff0c;提高网络的可扩展性&#xff0c;实现路由过滤和路由汇总&#xff0…

交通标志识别项目 | 基于Tensorflow+SSD实现道路交通标志识别

项目应用场景 面向智能驾驶或自动驾驶场景道路道路交通标志的识别&#xff0c;在交通标志识别的基础上为下一步的智能决策提供前提 项目效果&#xff1a; 项目细节 > 具体参见项目 README.md (1) 安装依赖 Python3.5、TensorFlow v0.12.0、Pickle、OpenCV-Python、Matplotl…

如何利用CSS实现文字滚动效果

1. 使用CSS3的animation属性 CSS3的animation属性可以让元素在一段时间内不停地播放某个动画效果。我们可以利用这个特性来实现文字滚动效果。 我们需要定义一个包含所有需要滚动的文本的容器元素。比如&#xff1a; <div class"scroll-container"><p>…

手机一键换ip地址,解锁网络自由

在数字化时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着移动互联网的快速发展&#xff0c;手机用户对于网络安全和隐私保护的需求也日益增强。其中&#xff0c;IP地址作为手机在网络中的标识&#xff0c;扮演着重要的角色。有时&#xff0c;出于隐私保护或网络…

仿真黑科技EasyGo DeskSim 2022

DeskSim2022的FPGA支持多种solver的混合应用&#xff0c;对于每一种solver可以采用不同的仿真步长&#xff0c;以下图模型为例&#xff0c;模型运行在FPGA上&#xff0c;FPGA解算方式采用的是Power Electronic & FPGA Coder解算&#xff0c;其中电力电子电路部分采用了两种…

【opencv】教程代码 —features2D(6)透视矫正:读取两个棋盘格图片并进行图像对齐...

perspective_correction.cpp 透视校正 hconcat(img2, img1_warp, img_draw_warp); hconcat(img1, img2, img_draw_matches); #include <iostream> // 引入iostream库&#xff0c;用于进行标准输入和输出操作 #include <opencv2/core.hpp> // 引入opencv的core库&am…

Redis 主从复制集群搭建及其原理

目录 前言 配置文件 启动服务 配置主从关系 两种配置方式 slaveof 配置文件 补充 缺点 认证 复制原理 全量同步 增量同步 前言 单机的 redis 的性能虽然已经很强大了&#xff0c;但是随着业务的扩展&#xff0c;总有一天会遇到性能瓶颈&#xff0c;针对高并发带来…

cJSON(API的详细使用教程)

我们今天来学习一般嵌入式的必备库&#xff0c;JSON库 1&#xff0c;json和cJSON 那什么是JSON什么是cJSON&#xff0c;他们之间有什么样的关联呢&#xff0c;让我们一起来探究一下吧。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&…

注意力机制篇 | YOLOv8改进之添加DAT注意力机制

前言:Hello大家好,我是小哥谈。DAT(Vision Transformer with Deformable Attention)是一种引入了可变形注意力机制的视觉Transformer。在训练算法模型的时候,通过引入可变形注意力机制,改进了视觉Transformer的效率和性能,使其在处理复杂的视觉任务时更加高效和准确。�…

扫地机器人(蓝桥杯)

文章目录 扫地机器人题目描述解题思路二分贪心 扫地机器人 题目描述 小明公司的办公区有一条长长的走廊&#xff0c;由 N 个方格区域组成&#xff0c;如下图所 示。 走廊内部署了 K 台扫地机器人&#xff0c;其中第 i 台在第 Ai 个方格区域中。已知扫地机器人每分钟可以移动…

黑马HTMLCSS基础

黑马的笔记和资料都是提供好了的&#xff0c;这个文档非常适合回顾复习。我在黑马提供的笔记上做了一些微不足道的补充&#xff0c;以便自己复习查阅。该笔记比较重要的部分是 表单&#xff0c;http请求 第一章. HTML 与 CSS HTML 是什么&#xff1a;即 HyperText Markup lan…

目标检测——植物病害图像数据集

一、重要性及意义 首先&#xff0c;植物病害图像是了解农业中植物生长和受病害情况的重要信息来源。通过对这些图像的分析&#xff0c;可以直观地观察到植物的生长状况&#xff0c;及时发现病害的存在。这不仅有助于农民和研究人员快速、准确地诊断植物病害&#xff0c;还能为…

代码随想录第27天 | 39. 组合总和、40.组合总和II、131.分割回文串

一、前言 今天的主题还是回溯算法&#xff0c;还是根据那个backtracking模板&#xff0c;但是今天会涉及到去重和一些小细节的问题。 二、组合总和 1、思路&#xff1a; 我一开始的想法就是在for循环转化为&#xff1a; for(int i 0; i < size; i) 但是这个是会陷入一…

C#实现Word文档转Markdown格式(Doc、Docx、RTF、XML、WPS等)

文档格式的多样性丰富了我们的信息交流手段&#xff0c;其中Word文档因其强大的功能性而广受欢迎。然而&#xff0c;在网络分享、版本控制、代码阅读及编写等方面&#xff0c;Markdown因其简洁、易于阅读和编辑的特性而展现出独特的优势。将Word文档转换为Markdown格式&#xf…

智慧安防监控EasyCVR视频调阅和设备录像回看无法自动播放的原因排查与解决

智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、…

JMeter自定义日志与日志分析

1 JMeter日志概览 JMeter与Java程序一样&#xff0c;会记录事件日志&#xff0c;日志文件保存在bin目录中&#xff0c;名称为jmeter.log。当然&#xff0c;我们也可以在面板中直接察看日志&#xff0c;点击右上角黄色标志物可以打开日志面板&#xff0c;再次点击收起。 可见&…

数据分析之Tebleau可视化:折线图、饼图、环形图

1.折线图的绘制 方法一&#xff1a; 拖入订单日期和销售金额&#xff0c;自动生成一个折线图 方法二&#xff1a; 选中订单日期和销售金额&#xff08;摁住ctrl可以选择多个纬度&#xff09; 点击右边的智能推荐&#xff0c;选择折线图 2.双线图的绘制、双轴的设置 方法一&…