当前位置: 首页 > news >正文

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

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

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

  • 注意,同时需要使用XAML重新定义模板样式,因为默认的模块存在ContentPresenter,会显示原来的格式
  • IsReverse属性可以修改文本从右往左还是从左往右的排列在这里插入图片描述
    在这里插入图片描述
    使用:
    <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.dtcms.com/a/388862.html

相关文章:

  • 多色零件自动化分拣与追溯系统案例和项目落地全计划
  • 自动化面试常见问题(英文版)
  • Kettle Carte 服务实战:从作业提交到日志监控全流程自动化(附 Shell 脚本)
  • 【数字展厅】数字科技展厅是怎么建设沉浸式体验的?
  • 2025网安周|美创科技多地联动,共筑数据安全防线
  • 数字大健康:一场重塑未来的健康革命,正被科技重新定义
  • 手搓一个可以自动化对比yolo模型性能曲线的工具
  • 海图科技双撕裂检测装置:筑牢矿用皮带运输安全防线
  • 32、语言模型训练全流程:从数据到模型的工程化实现
  • 打造一款支持 Mermaid 与 ECharts 的 Markdown 编辑器:基于 Vditor 的实战指南
  • 《算法闯关指南:优选算法-双指针》--07三数之和,08四数之和
  • 华为显卡部署
  • Salesforce知识点:LWC(Lightning Web Components)面试题及答案
  • 【C/C++】一文通关C/C++内存管理:动态开辟改朝换代——new/delete
  • 安卓13_ROM修改定制化-----修改rom 实现“usb安装”选项默认开启
  • Git 常用命令速查表
  • Day45 51单片机UART串口通信与数码管时钟系统
  • 企业级图像AIGC技术观察:Seedream 4.0 模型能力与应用场景分析
  • Kurt-Blender零基础教程:第2章:建模篇——第2节:什么是修改器与建模马拉松
  • fbx 导入到 blender 出现很多黑色虚线的解决方法
  • 记力扣.2779 数组的最大美丽值 练习理解
  • Day26_【深度学习(6)—神经网络NN(2)前向传播的搭建案例】
  • 古老的游戏之竞技体育
  • CURSOR平替(deepseek+VScode)方案实现自动化编程
  • java对电子发票是否原件的快速检查
  • 贪心算法应用:顶点覆盖问题详解
  • Odoo中非库存商品的高级自动化采购工作流程
  • 缺少自动化测试会对 DevOps 带来哪些风险
  • 深入解析 Python 中的 __pycache__与字节码编译机制
  • SEO 优化:元数据 (Metadata) API 和站点地图 (Sitemap) 生成