WPF 字符竖向排列的排版格式(直排)表明控件

news/2025/9/20 12:52:03/文章来源:https://www.cnblogs.com/wzzkaifa/p/19102309

WPF 字符竖向排列的排版格式(直排)显示控件

自定义控件,继承自Label,重写OnRender方法,使用DrawingContext手动绘制文本。自动换列。

<local:VerticalTextBlock Width="280"Height="200"HorizontalAlignment="Left"Background="#555C8B00"Content="床前明月光疑是地上霜举头望明月低头思故乡"FontFamily="宋体"FontSize="40"FontWeight="Bold"Foreground="Black"IsReverse="False" />

C#代码:

public class VerticalTextBlock
: Label
{
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
int charsPerColumn = (int)(ActualWidth / FontSize);
int charsPerRow = (int)(ActualHeight / FontSize);
if (charsPerColumn == 0) charsPerColumn = 1;
for (int i = 0; i < Content.ToString().Length; i++)
{
var formattedText = new FormattedText(
Content.ToString()[i].ToString(),
CultureInfo.CurrentUICulture,
FlowDirection,
new Typeface(FontFamily, FontStyle = FontStyle, FontWeight = FontWeight, FontStretch = FontStretch),
FontSize,
Foreground, 1.25);
int column = 0;
int row = 0;
if (charsPerRow != 0)
{
column = i / charsPerRow;
row = i % charsPerRow;
}
if (!IsReverse)
{
column = charsPerColumn - 1 - column;
}
drawingContext.DrawText(formattedText, new Point(column * FontSize, row * FontSize));
}
}
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
InvalidateVisual();
}
public bool IsReverse
{
get {
return (bool)GetValue(IsReverseProperty);
}
set {
SetValue(IsReverseProperty, value);
}
}
public static readonly DependencyProperty IsReverseProperty =
DependencyProperty.Register("IsReverse", typeof(bool), typeof(VerticalTextBlock), new PropertyMetadata(false, OnIsReverseChanged));
private static void OnIsReverseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = d as VerticalTextBlock;
if (control != null)
{
control.InvalidateVisual();
}
}
}

xaml代码:

<Style TargetType="local:VerticalTextBlock"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="local:VerticalTextBlock"><Border Padding="{TemplateBinding Padding}"Background="{TemplateBinding Background}"BorderBrush="{TemplateBinding BorderBrush}"BorderThickness="{TemplateBinding BorderThickness}" /></ControlTemplate></Setter.Value></Setter>
</Style>

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

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

相关文章

新建Vue3项目流程

新建Vue3项目流程​一、环境准备​​ 创建Vue3项目前,需确保系统安装以下工具:• ​​Node.js​​:建议使用LTS版本(≥18.3),可通过node -v命令检查是否安装成功;• ​​包管理工具​​:推荐使用npm(Node.js自…

G. Chimpanzini Bananini

View PostG. Chimpanzini BananiniG. Chimpanzini Bananini大致题意:有以下三种操作:循环右移数组,即 \([a_1, a_2, \ldots, a_n]\) 变成 \([a_n, a_1, a_2, \ldots, a_{n-1}]\)。 反转数组,即 \([a_1, a_2, \ldot…

深入解析:HSA35NV001美光固态闪存NQ482NQ470

深入解析:HSA35NV001美光固态闪存NQ482NQ470pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

ERP和MES、WMS、CRM,到底怎么配合 - 智慧园区

最近和不少老板聊ERP的时候,有句话听得特别多:总部说上了ERP就够了 可仓库说还要WMS 生产说MES必不可少 销售又提CRM这些系统到底怎么配合? 这话一出,就把企业信息化的痛点揭示出来了—— 很多老板以为ERP能包打天…

YOLO实战应用 1YOLOv5 架构与模块

实战应用 YOLOv5 架构与模块 核心概念YOLOv5:YOLO 系列的工程化实现,结构更简洁,代码更易读。 配置文件解析:通过 .yaml/.cfg 文件逐层定义网络结构。 Focus 模块:将输入图像切片重组,降低空间分辨率的同时增加…

YOLO实战应用 2数据准备与增强

实战应用 2数据准备与增强 核心概念残差模块 (shortcut / cover block):通过卷积与捷径连接实现特征相加,保证深层网络训练稳定。 NMS(非极大值抑制):用于去除多余重叠框,提升检测结果的准确性。 Soft-NMS:对高…

Day18稀疏数组

二维数组中的大部分默认值都为零,导致记录了许多没有意义的数据,稀疏数组用坐标对应有效值的方式大大简化了原本繁杂的数组package com.cc.array;import java.util.Arrays;public class ArrayDemo8 {public static v…

底层

面向过程转变成面向对象的底层逻辑 本套课程有一定难度,讲得不好,请多多包涵!里面有很多我的个人见解(仅供参考!如有指导,请把邮件发送到该邮箱690141760@qq.com) 如果有人问面向对象四大特征是什么?我相信基本…

YOLO实战应用 3训练与优化策略

实战应用 3训练与优化策略 核心概念数据加载与缓存:通过缓存机制提升训练效率,避免重复读取和处理标签。 Mosaic 数据增强:随机拼接四张图像,提升数据多样性与模型鲁棒性。 Batch 构建:一次迭代处理多个样本,并…

WPF 视图缩略图控件(支持缩放调节与拖拽定位)

实现 WPF 应用中画布的缩放控制与缩略图导航,支持滑块调节缩放比例、缩略图拖拽定位,实时同步主画布视图与缩略图视口位置。缩放控制:通过 Slider 值变化计算缩放比例,同步更新主画布 ScaleTransform,并调整 Scro…

实用指南:Dify关联Ollama

实用指南:Dify关联Ollama2025-09-20 12:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

ik中文分词器使用

IK分词器介绍 在ElasticSearch中默认使用的分词器为Standard分词器,该分词器对中文不友好,对中文的处理方式是按单个汉字分词,无法识别中文里的词语、短语等语义单元。例如对于 "汉朝" 这个词,默认分词器…

动态水印也能去除?ProPainter一键视频抠图整合包下载

ProPainter是一个基于E2FGVI实现的AI视频编辑工具,它结合了增强的传播和Transformer机制,能够快速高效地进行视频修复和水印去除功能特点对象移除:智能地检测和移除视频中的动态物体,对于去除不需要的元素或错误…

SpringBoot整合RustFS:全方位优化文件上传性能

SpringBoot整合RustFS:全方位优化文件上传性能作为一名多年深耕分布式存储的架构师,我在多个企业级项目中成功实施SpringBoot与RustFS的集成。本文将分享一套​经过实战检验的性能优化方案,帮助你的文件上传速度提升…

javaScript(WebAPI) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

windows使用es-client插件

下载插件并集成到浏览器 在各大浏览器应用商店搜索es-client,这里以edge浏览器作为演示,bing搜索“微软商店 插件 es-clint”,搜索结果第一条记录点击进去.点击右边的“获取”按钮,将插件添加到浏览器中。这里由于…

AI学习日记 - 实践

AI学习日记 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Co…

es中的端点

_doc端点 用于对单个****文档的crud操作(如创建、获取、更新、删除单个文档),常见用法如下向指定索引添加新文档: POST /索引名/_docES会自动生成唯一文档ID,例:POST /books/_doc → 向 books索引添加新文档。 根…

解码C语言宏

预处理概述 基本概念 预处理是C语言编译过程的第一步,所有以#开头的指令都由预处理器处理,这些指令不属于C语言语法本身。 预处理指令类型头文件包含:#include 宏定义:#define 宏取消:#undef 条件编译:#if, #ifd…

es中的索引

索引的概念 在ES中,索引(Index) 是核心的数据存储和检索单元,其本质是一组结构相似的文档(Document)的集合,同时包含了文档的元数据(如字段类型、分词器配置)和检索所需的 “倒排索引” 结构。ES软件的索引类…