WPF学习笔记-FlowDocument实现表格单元格垂直居中以及边框设置

news2025/1/23 2:19:05

文章目录

  • 概述
  • 一、基本方案
    • 1.1 添加Grid
    • 1.2 添加列
    • 1.3 添加行
    • 1.4 添加Grid的时候同时添加行和列
  • 1.5 添加元素
    • 1.6 获取指定单元格的元素
    • 1.7 添加TextBlock元素
      • 1.7.1 直接添加字符串
      • 1.7.2 添加Paragraph
    • 1.8 获取文本内容
    • 1.9 获取元素
  • 二、其他操作
    • 2.1 设置边框
    • 2.2 设置隔行颜色
    • 2.3 设置自动合并单元格
    • 2.4 分割单元格
  • 总结

太羽惊鸿一留衣
诗号:一弦一调一管笙,太羽荒音锁残年;一棋一局一盅子,惊鸿留影人留衣。
武道内发七修之一,头戴月冠帽,喜好棋奕,武学兼各家之长,有隐世高人之风。与外聚七修的日吹烟为多年棋友,当初与意琦行打败外七修后,一留衣受日吹烟遗言所托,带著鬼瞳与三机谶离开叫唤渊薮,透过无涯之涯空间隙缝来到中阴界,就此隐居泥犁森狱,并结识鬼师缉仲,赠予三机谶。
在这里插入图片描述

概述

FlowDocument是WPF的高级文档功能(如分页和列)承载流内容和设置流内容格式。
其中的块元素Table可以很方便的添加并展示表格,但是其无法实现自动换行,我尝试了网上搜索解决方案以及自己尝试修改。
在网上搜索了不同的解决方案,包括手动计算高度,通过Margin属性来实现类似居中的问题,或者尝试在单元格中添加BlockUIContainerl来实现居中,但是实际由于TableCell自身没有居中,或者适应宽度,最终都以失败告终。

最终我通过Grid实现了该功能,而且可以跨页自动换行。

一、基本方案

基本思路是通过BlockUIContainer作为容器,然后使用Grid替换Table,通过Border来设置边框,通过TextBlock来替代TableCell,进而实现表格居中,只需要设置TextBlock的居中模式就可以自动居中了。

1.1 添加Grid


        /// <summary>
        /// Add grid control.
        /// </summary>
        /// <returns></returns>
        public static Grid AddGrid(FlowDocument flowDocument, Grid grid)
        {
   
            if (flowDocument == null) return null;

            BlockUIContainer uIContainer = new BlockUIContainer();
            uIContainer.Padding = new Thickness(0);
            flowDocument.Blocks.Add(uIContainer);
            grid.Margin = new Thickness(0);
            uIContainer.Child = grid;

            return grid;
        }

1.2 添加列

        /// <summary>
        /// 添加列
        /// </summary>
        /// <param name="grid"></param>
        /// <param name="rowCnt"></param>
        public static void AddGridNewColumns(Grid grid, int columnCnt)
        {
    
            if (grid == null) return;
            for (int i = 0; i < columnCnt; i++)
            {
   
                grid.ColumnDefinitions.Add(new ColumnDefinition());
                for (int rowIndex = 0; rowIndex < grid.RowDefinitions.Count; rowIndex++)
                {
   
                    AddGridChildren(grid, new Border(), rowIndex, grid.ColumnDefinitions.Count - 1);
                }
            }
        }

1.3 添加行

        /// <summary>
        /// 添加行
        /// </summary>
        /// <param name="grid"></param>
        /// <param name="rowCnt"></param>
        public static void AddGridNewRows(Grid grid, int rowCnt)
        {
    
            if (grid == null) return;
            for (int i = 0; i < rowCnt; i++)
            {
   
                grid.RowDefinitions.Add(new RowDefinition());
                for (int colIndex = 0; colIndex < grid.ColumnDefinitions.Count; colIndex++)
                {
   
                    Border border = new Border();
                    AddGridChildren(grid, border, grid.RowDefinitions.Count - 1, colIndex);
                }
            }
        }

1.4 添加Grid的时候同时添加行和列

        /// <summary>
        /// Add grid control.
        /// </summary>
        /// <param name="rowCnt"></param>
        /// <param name="columnCnt"></param>
        /// <returns></returns>
        public static Grid AddGrid(FlowDocument flowDocument, int rowCnt = 0, int columnCnt = 0)
        {
   
            if (flowDocument == null) return null;

            BlockUIContainer uIContainer = new BlockUIContainer();
            flowDocument.Blocks.Add(uIContainer);
            Grid grid = new Grid();
            grid.Margin = new Thickness(0, 5, 0, 5);
            uIContainer.Child = grid;
            AddGridNewColumns(grid, columnCnt);
            AddGridNewRows(grid, rowCnt);

            return grid;
        }

1.5 添加元素

        /// <summary>
        /// Add UIELement to grid.
        /// </summary>
        /// <param name="grid"></param>
        /// <param name="element"></param>
        /// <param name="row"></param>
        /// <param name="column"></param>
        public static void AddGridChildren(Grid grid, UIElement element, int row = 

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

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

相关文章

深入剖析Xen与KVM虚拟化技术及其架构特点

引言 在现代数据中心与云计算领域中&#xff0c;虚拟化技术已经成为提升资源利用率、增强灵活性与可扩展性的重要基石。其中&#xff0c;Xen与KVM作为两种备受瞩目的开源虚拟化解决方案&#xff0c;分别以其独特的设计理念与技术创新引领着行业的进步与发展。Xen源自剑桥大学的…

Excel 隔几行批量插入空白行

例如如下表格&#xff0c;每隔6行插入一行数据&#xff1a; 1&#xff09;第7个单元格输入1 2&#xff09;选中6个单元格&#xff0c;然后双击填充数据&#xff1a; 3&#xff09;F5 找到常量 Ctrlshift 复制插入的数据&#xff0c;然后选中数据 按F5&#xff0c;定位到空值

非关系型数据库之Redis配置与优化

一、关系数据库与非关系型数据库 1.1关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上一般面向于记录。SQL语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&#xff0c;用…

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

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

分类预测 | Matlab实现CNN-GRU-Mutilhead-Attention卷积神经网络-门控循环单元融合多头注意力机制多特征分类预测

分类预测 | Matlab实现CNN-GRU-Mutilhead-Attention卷积神经网络-门控循环单元融合多头注意力机制多特征分类预测 目录 分类预测 | Matlab实现CNN-GRU-Mutilhead-Attention卷积神经网络-门控循环单元融合多头注意力机制多特征分类预测分类效果基本介绍模型描述程序设计参考资料…

Web实例_报表开发01-基于HTML进行报表呈现

Web实例_报表开发01-基于HTML进行报表呈现 报表开发是一种在利用了软件的基础上, 针对不同类型的报表, 进行开放的工作。 而以报表的方式, 将相关的内容、数值呈现出来的话, 则会起到更好的概况作用。 再加上, 报表开发工作是依托于计算机来完成的, 因此在效率、完整性等方面…

蓝桥杯-穿越雷区

题目要求 需求&#xff1a;从一个方格中A点&#xff0c;按要求移动到B点。 要求&#xff1a;每次只能走上下左右&#xff0c;每次只能走一次&#xff0c;每次是轮换穿越’‘,’-两个&#xff0c;否则就会能量失衡&#xff0c;发生爆炸。 使用的算法&#xff1a;这题典型的就是使…

6款Mac垃圾清理软件横评 Mac电脑清理软件哪个好 cleanmymac评测

鉴于苹果笔记本昂贵的硬盘价格&#xff0c;导致我们不得不定期清理自己的硬盘空间&#xff0c;释放给真正有用的各种程序等。 即便我们把程序安装到外置硬盘&#xff0c;但是程序运行时的缓存&#xff0c;仍然是在内置的硬盘中。 今天就让我们对比看看&#xff0c;目前市面上…

Linux如何连接github仓库

一.创建一个github账号 如何创建一个github账号 二.在github上创建一个仓库 登录上github后出现这个界面 然后点击左上角头像&#xff0c;在按照图片位置点击&#xff1a; 继续按照图片上的位置进行点击&#xff1a; 创建成功&#xff1a; 三.云主机连接Github仓库 1.在linux中…

openstack云计算(二)——使用Packstack安装器安装一体化OpenStack云平台

初步掌握OpenStack快捷安装的方法。掌握OpenStack图形界面的基本操作。 一【准备阶段】 &#xff08;1&#xff09;准备一台能够安装OpenStack的实验用计算机&#xff0c;建议使用VMware虚拟机。 &#xff08;2&#xff09;该计算机应安装CentOS 7&#xff0c;建议采用CentO…

探究云手机的海外原生IP优势

随着全球数字化进程的加速&#xff0c;企业越来越依赖于网络来扩展其业务。在这个数字时代&#xff0c;云手机作为一种创新的通信技术&#xff0c;已经成为了企业网络优化的重要组成部分。云手机支持海外原生IP的特性&#xff0c;为企业在国际市场上的拓展提供了全新的可能性。…

基础布局之LinearLayout线性布局

目录 一、基础属性二、重点属性2.1 weight(权重)属性&#xff1a;2.2 gravity 一、基础属性 LinearLayout默认方向是水平排放 属性作用android:id控件的ID&#xff0c;可以通过这个ID号来找到对应的控件android:layout_width控件的宽度android:layout_height控件的高度androi…

解析Apache Kafka:在大数据体系中的基本概念和核心组件

关联阅读博客文章&#xff1a;探讨在大数据体系中API的通信机制与工作原理 关联阅读博客文章&#xff1a;深入解析大数据体系中的ETL工作原理及常见组件 关联阅读博客文章&#xff1a;深度剖析&#xff1a;计算机集群在大数据体系中的关键角色和技术要点 关联阅读博客文章&a…

大数据系列 | Kafka架构分析及应用

大数据系列 | Kafka架构分析及应用 1. Kafka原理分析2. Kafka架构分析3. Kafka的应用3.1. 安装Zookeeper集群3.2. 安装Kafka集群3.3. 生产者和消费者使用3.3.1. 生产者使用3.3.1. 消费者使用 4. Kafka Controller控制器 1. Kafka原理分析 Kafka是一个高吞吐量、 持久性的分布式…

vue项目打包优化之-productionSourceMap设置

productionSourceMap 是一个用于配置生产环境下是否生成 source map 文件的选项。在 webpack 中&#xff0c;source map 文件是一种映射关系文件&#xff0c;可以将编译后的代码映射回原始源代码&#xff0c;方便开发者在调试时定位问题。 在生产环境中&#xff0c;通常不建议暴…

海康摄像头插件嵌入iframe时视频播放插件位置问题

参考&#xff1a;https://juejin.cn/post/6857670423971758094 原因&#xff1a;没有按照iframe相对位置计算视频插件位置。 解决&#xff1a; $(window).on(resize, resize);function resize(){// 解决iframe中嵌入海康插件初始化问题:// 1. 获取iframe相比于窗口的偏移量;c…

单V及多V感知在自动驾驶在恶劣环境条件下的感知提升方案

单V及多V感知在自动驾驶在恶劣环境条件下的感知提升方案 附赠自动驾驶学习资料和量产经验&#xff1a;链接 自动驾驶中的视觉感知是车辆在不同交通条件下安全、可持续地行驶的关键部分。然而&#xff0c;在大雨和雾霾等恶劣天气下&#xff0c;视觉感知性能受到多种降级效应的极…

2021-08-06

yarn的简介&#xff1a; Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点&#xff1a; 速度超快。 Yarn 缓存了每个下载过的包&#xff0c;所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率&#xff0c;因此安装速度更快。超级安全。 在执行代码…

适用于智能断路器、新能源汽车充电枪锁、电动玩具、电磁门锁等的直流电机驱动芯片D6289ADA介绍

应用领域 适用于智能断路器&#xff08;家用或工业智能空开&#xff09;、新能源汽车充电枪锁、电动玩具、电磁门锁、自动阀门等的直流电机驱动。 功能介绍 D6289ADA是一款直流马达驱动芯片&#xff0c;它有两个逻辑输入端子用来控制电机前进、后退及制动。该电路具有良好的抗干…

Qt 实现简易的视频播放器,功能选择视频,播放,暂停,前进,后退,进度条拖拉,视频时长显示

1.效果图 2.代码实现 2.1 .pro文件 QT core gui multimedia multimediawidgets 2.2 .h文件 #ifndef VIDEOPLAYING_H #define VIDEOPLAYING_H#include <QWidget> #include<QFileDialog>#include<QMediaPlayer> #include<QMediaRecorder> #in…