WPF自定义空心文字

WPF自定义空心文字
原文:WPF自定义空心文字

  首先创建一个自定义控件,继承自FrameworkElement,“Generic.xaml”中可以不添加样式。

  要自定义空心文字,要用到绘制格式化文本FormattedText类。FormattedText对象提供的文本格式设置功能比WPF提供的已有文本控件提供的相应功能更为强大。调用FormattedText构造函数,可以传入相应的参数,得到我们想要的文本样式。使用 MaxTextWidth 属性可以将文本约束为特定宽度。 文本将自动换行,以避免超过指定宽度。 使用 MaxTextHeight 属性可以将文本约束为特定高度。 超过指定高度的文本将显示一个省略号“…”。

  接下来重写OnRender方法,在方法体中调用DrawingContext对象的DrawGeometry方法即可完成文本的绘制工作。

 

  1     public class OutlinedText : FrameworkElement, IAddChild
  2     {
  3         /// <summary>
  4         /// 静态构造函数
  5         /// </summary>
  6         static OutlinedText()
  7         {
  8             DefaultStyleKeyProperty.OverrideMetadata(typeof(OutlinedText), new FrameworkPropertyMetadata(typeof(OutlinedText)));
  9         }
 10 
 11 
 12         #region Private Fields
 13 
 14         /// <summary>
 15         /// 文字几何形状
 16         /// </summary>
 17         private Geometry m_TextGeometry;
 18 
 19         #endregion
 20 
 21 
 22         #region Private Methods
 23 
 24         /// <summary>     
 25         /// 当依赖项属性改变文字无效时,创建新的空心文字对象来显示。
 26         /// </summary>     
 27         /// <param name="d"></param>     
 28         /// <param name="e"></param>     
 29         private static void OnOutlineTextInvalidated(DependencyObject d, DependencyPropertyChangedEventArgs e)
 30         {
 31             if (Convert.ToString(e.NewValue) != Convert.ToString(e.OldValue))
 32             {
 33                 ((OutlinedText)d).CreateText();
 34             }
 35         }
 36 
 37         #endregion
 38 
 39 
 40         #region FrameworkElement Overrides
 41 
 42         /// <summary>     
 43         /// 重写绘制文字的方法。   
 44         /// </summary>     
 45         /// <param name="drawingContext">空心文字控件的绘制上下文。</param>     
 46         protected override void OnRender(DrawingContext drawingContext)
 47         {
 48             //CreateText();
 49             // 基于设置的属性绘制空心文字控件。         
 50             drawingContext.DrawGeometry(Fill, new Pen(Stroke, StrokeThickness), m_TextGeometry);
 51         }
 52 
 53         /// <summary>     
 54         /// 基于格式化文字创建文字的几何轮廓。    
 55         /// </summary>     
 56         public void CreateText()
 57         {
 58             FontStyle fontStyle = FontStyles.Normal;
 59             FontWeight fontWeight = FontWeights.Medium;
 60             if (Bold == true)
 61                 fontWeight = FontWeights.Bold;
 62             if (Italic == true)
 63                 fontStyle = FontStyles.Italic;
 64             // 基于设置的属性集创建格式化的文字。        
 65             FormattedText formattedText = new FormattedText(
 66                 Text, CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight,
 67                 new Typeface(Font, fontStyle, fontWeight, FontStretches.Normal),
 68                 FontSize, Brushes.Black);
 69             formattedText.MaxTextWidth = this.MaxTextWidth;
 70             formattedText.MaxTextHeight = this.MaxTextHeight;
 71             // 创建表示文字的几何对象。        
 72             m_TextGeometry = formattedText.BuildGeometry(new Point(0, 0));
 73             // 基于格式化文字的大小设置空心文字的大小。         
 74             this.MinWidth = formattedText.Width;
 75             this.MinHeight = formattedText.Height;
 76         }
 77 
 78         #endregion
 79 
 80 
 81         #region DependencyProperties
 82 
 83         /// <summary>
 84         /// 指定将文本约束为特定宽度
 85         /// </summary>
 86         public double MaxTextWidth
 87         {
 88             get { return (double)GetValue(MaxTextWidthProperty); }
 89             set { SetValue(MaxTextWidthProperty, value); }
 90         }
 91         /// <summary>
 92         /// 指定将文本约束为特定宽度依赖属性
 93         /// </summary>
 94         public static readonly DependencyProperty MaxTextWidthProperty =
 95             DependencyProperty.Register("MaxTextWidth", typeof(double), typeof(OutlinedText),
 96                 new FrameworkPropertyMetadata(1000.0, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnOutlineTextInvalidated), null));
 97 
 98         /// <summary>
 99         /// 指定将文本约束为特定高度
100         /// </summary>
101         public double MaxTextHeight
102         {
103             get { return (double)GetValue(MaxTextHeightProperty); }
104             set { SetValue(MaxTextHeightProperty, value); }
105         }
106         /// <summary>
107         /// 指定将文本约束为特定高度依赖属性
108         /// </summary>
109         public static readonly DependencyProperty MaxTextHeightProperty =
110             DependencyProperty.Register("MaxTextHeight", typeof(double), typeof(OutlinedText),
111                  new FrameworkPropertyMetadata(1000.0, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnOutlineTextInvalidated), null));
112 
113         /// <summary>     
114         /// 指定字体是否加粗。   
115         /// </summary>     
116         public bool Bold
117         {
118             get { return (bool)GetValue(BoldProperty); }
119             set { SetValue(BoldProperty, value); }
120         }
121         /// <summary>     
122         /// 指定字体是否加粗依赖属性。    
123         /// </summary>     
124         public static readonly DependencyProperty BoldProperty = DependencyProperty.Register(
125             "Bold", typeof(bool), typeof(OutlinedText),
126             new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnOutlineTextInvalidated), null));
127 
128         /// <summary>     
129         /// 指定填充字体的画刷颜色。    
130         /// </summary>     
131         /// 
132         public Brush Fill
133         {
134             get { return (Brush)GetValue(FillProperty); }
135             set { SetValue(FillProperty, value); }
136         }
137         /// <summary>     
138         /// 指定填充字体的画刷颜色依赖属性。    
139         /// </summary>     
140         public static readonly DependencyProperty FillProperty = DependencyProperty.Register(
141             "Fill", typeof(Brush), typeof(OutlinedText),
142             new FrameworkPropertyMetadata(new SolidColorBrush(Colors.LightSteelBlue), FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnOutlineTextInvalidated), null));
143 
144         /// <summary>     
145         /// 指定文字显示的字体。   
146         /// </summary>    
147         public FontFamily Font
148         {
149             get { return (FontFamily)GetValue(FontProperty); }
150             set { SetValue(FontProperty, value); }
151         }
152         /// <summary>     
153         /// 指定文字显示的字体依赖属性。     
154         /// </summary>     
155         public static readonly DependencyProperty FontProperty = DependencyProperty.Register(
156             "Font", typeof(FontFamily), typeof(OutlinedText),
157             new FrameworkPropertyMetadata(new FontFamily("Arial"), FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnOutlineTextInvalidated), null));
158 
159         /// <summary>     
160         /// 指定字体大小。
161         /// </summary>     
162         public double FontSize
163         {
164             get { return (double)GetValue(FontSizeProperty); }
165             set { SetValue(FontSizeProperty, value); }
166         }
167         /// <summary>     
168         /// 指定字体大小依赖属性。     
169         /// </summary>     
170         public static readonly DependencyProperty FontSizeProperty = DependencyProperty.Register(
171             "FontSize", typeof(double), typeof(OutlinedText),
172             new FrameworkPropertyMetadata((double)48.0, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnOutlineTextInvalidated), null));
173 
174         /// <summary>     
175         /// 指定字体是否显示斜体字体样式。  
176         /// </summary>     
177         public bool Italic
178         {
179             get { return (bool)GetValue(ItalicProperty); }
180             set { SetValue(ItalicProperty, value); }
181         }
182         /// <summary>     
183         /// 指定字体是否显示斜体字体样式依赖属性。   
184         /// </summary>     
185         public static readonly DependencyProperty ItalicProperty = DependencyProperty.Register(
186             "Italic", typeof(bool), typeof(OutlinedText),
187             new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnOutlineTextInvalidated), null));
188 
189         /// <summary>     
190         /// 指定绘制空心字体边框画刷的颜色。    
191         /// </summary>     
192         public Brush Stroke
193         {
194             get { return (Brush)GetValue(StrokeProperty); }
195             set { SetValue(StrokeProperty, value); }
196         }
197         /// <summary>     
198         /// 指定绘制空心字体边框画刷的颜色依赖属性。    
199         /// </summary>     
200         public static readonly DependencyProperty StrokeProperty = DependencyProperty.Register(
201             "Stroke", typeof(Brush), typeof(OutlinedText),
202             new FrameworkPropertyMetadata(new SolidColorBrush(Colors.Teal), FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnOutlineTextInvalidated), null));
203 
204         /// <summary>     
205         /// 指定空心字体边框大小。  
206         /// </summary>     
207         public ushort StrokeThickness
208         {
209             get { return (ushort)GetValue(StrokeThicknessProperty); }
210             set { SetValue(StrokeThicknessProperty, value); }
211         }
212         /// <summary>     
213         /// 指定空心字体边框大小依赖属性。      
214         /// </summary>     
215         public static readonly DependencyProperty StrokeThicknessProperty =
216             DependencyProperty.Register("StrokeThickness",
217             typeof(ushort), typeof(OutlinedText),
218             new FrameworkPropertyMetadata((ushort)0, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnOutlineTextInvalidated), null));
219 
220         /// <summary>    
221         /// 指定要显示的文字字符串。  
222         /// </summary>     
223         public string Text
224         {
225             get { return (string)GetValue(TextProperty); }
226             set { SetValue(TextProperty, value); }
227         }
228         /// <summary>     
229         /// 指定要显示的文字字符串依赖属性。  
230         ///  </summary>    
231         public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
232             "Text", typeof(string), typeof(OutlinedText),
233             new FrameworkPropertyMetadata("",
234                 FrameworkPropertyMetadataOptions.AffectsRender,
235                 new PropertyChangedCallback(OnOutlineTextInvalidated),
236                 null));
237 
238         #endregion
239 
240 
241         #region Public Methods
242 
243         /// <summary>
244         /// 添加子对象。
245         /// </summary>
246         /// <param name="value">要添加的子对象。</param>
247         public void AddChild(Object value)
248         { }
249 
250         /// <summary>
251         /// 将节点的文字内容添加到对象。
252         /// </summary>
253         /// <param name="value">要添加到对象的文字。</param>
254         public void AddText(string value)
255         {
256             Text = value;
257         }
258 
259         #endregion
260     }

 

 

 源码下载

 

posted on 2018-12-21 13:31 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10155253.html

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

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

相关文章

【转】UITableView详解(UITableViewCell

原文网址&#xff1a;http://www.kancloud.cn/digest/ios-1/107420 上一节中,我们定义的cell比较单一,只是单调的输入文本和插入图片,但是在实际开发中,有的cell上面有按钮,有的cell上面有滑动控件,有的cell上面有开关选项等等,具体参加下面2个图的对比: 我们可以通过…

时间模块和时间工具

一、time模块 三种格式 时间戳时间&#xff1a;浮点数 单位为秒 时间戳起始时间&#xff1a; 1970.1.1 0:0:0 英国伦敦时间 1970.1.1 8:0:0 我国(东8区) 结构化时间&#xff1a;元组(struct_time) 格式化时间&#xff1a;str数据类型的 1、常用方法 import timetime.sleep(secs…

php splqueue 5.5安装,解析PHP标准库SPL数据结构

SPL提供了双向链表、堆栈、队列、堆、降序堆、升序堆、优先级队列、定长数组、对象容器SplQueue 队列类进出异端&#xff0c;先进先出<?php $obj new SplQueue();//插入一个节点到top位置$obj->enqueue(1);$obj->enqueue(2);$obj->enqueue(3);/**SplQueue Object…

初识virtual memory

一、先谈几个重要的东西 virtual memory是一个抽象概念&#xff0c;书上的原文是"an abstraction of main memory known as virtual memory"&#xff08;参考资料p776&#xff09;。那么什么是抽象概念。下面说说我个人对这个东西的理解。 所谓抽象概念是指抽象出来的…

java闰年的年份,Java案例-判断给定年份是闰年

专注学子高考志愿填报&#xff0c;分享你所不知道信息。Java案例-判断给定年份是闰年案例描述编写程序&#xff0c;判断给定的某个年份是否是闰年。闰年的判断规则如下&#xff1a;(1)若某个年份能被4整除但不能被100整除&#xff0c;则是闰年。(2)若某个年份能被400整除&#…

通过path绘制点击区域

通过path绘制点击区域 效果 源码 https://github.com/YouXianMing/Animations // // TapDrawImageView.h // TapDrawImageView // // Created by YouXianMing on 16/5/9. // Copyright © 2016年 YouXianMing. All rights reserved. //#import <UIKit/UIKit.h> #…

Raft与MongoDB复制集协议比较

在一文搞懂raft算法一文中&#xff0c;从raft论文出发&#xff0c;详细介绍了raft的工作流程以及对特殊情况的处理。但算法、协议这种偏抽象的东西&#xff0c;仅仅看论文还是比较难以掌握的&#xff0c;需要看看在工业界的具体实现。本文关注MongoDB是如何在复制集中使用raft协…

推荐两款实用工具——hcache和SQLPad

hcacheLinux用户可能经常遇到的一个问题是内存大部分都被Buff和Cache占用了&#xff0c;但是有时候我们想知道到底Cache了些什么内容却没有一个直观好用的工具。今天给你介绍一个可以查看Linux当前缓存了哪些文件的小工具hcache。hcache是基于pcstat的&#xff0c;pcstat可以查…

jmeter学习笔记(一)

1.添加JSON Path Extractor >>下载地址&#xff1a;http://jmeter-plugins.org/downloads/all/&#xff0c;下载 JMeterPlugins-ExtrasLibs-X.X.X.zip下载 >>解压&#xff0c;将lib和lib/ext中的jar包放到安装目录对应位置&#xff0c;重启。 2.参数不能输入中文&…

【公众号系列】SAP S/4 HANA的移动平均价

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【公众号系列】SAP S/4 HANA的移动平均价写在前面 我在前面写了很多篇关于SAP S/4 HANA的新变化&#xff0c;并且多次提及了在财务模…

Hinton神经网络公开课10 Combining multiple neural networks to improve generalization

为什么80%的码农都做不了架构师&#xff1f;>>> 本文由码农场同步&#xff0c;最新版本请查看原文&#xff1a;http://www.hankcs.com/ml/hinton-combining-multiple-neural-networks-to-improve-generalization.html 这节课讲了为什么要综合多个模型&#xff0c;好…

基于MVC的网站和在线教育系统

最近老表说要创业&#xff0c;想要做一个网站做宣传&#xff0c;还想要一个在线教育系统。 学习了一部分 Java&#xff0c; 决定用.Net MVC做官网或直接做成静态HTML网站&#xff0c;主要是因为.Net MVC 技术简单&#xff0c;效率高&#xff0c;需求不确定。 考虑的点在&#…

Bagging与随机森林算法原理小结

在集成学习原理小结中&#xff0c;我们讲到了集成学习有两个流派&#xff0c;一个是boosting派系&#xff0c;它的特点是各个弱学习器之间有依赖关系。另一种是bagging流派&#xff0c;它的特点是各个弱学习器之间没有依赖关系&#xff0c;可以并行拟合。本文就对集成学习中Bag…

iOS:多线程技术GCD的使用

GCD的使用&#xff1a; 1.队列的类型1.1 主队列&#xff1a;mian queue,主线程队列,负责更行UI的操作。是一个串行的队列。1.2 系统默认的并行队列&#xff1a;global queue&#xff0c;按优先级分类。1.3 自定义的队列&#xff1a;可以创建串行队列或者是并行的队列2.任务2.1 …

java什么叫一致性,java-顺序一致性易失性说明

我正在从Java Jpoint会议观看视频.我对以下来自Alexey Shipilev报告的幻灯片有疑问&#xff1a;打扰一下,请不要打扰我.实际上,作者说不可能将变量集设置为r1 1 (Y)r2 0 (x)r3 1 (x)r4 0 (Y)根据视频,他暗示很明显.有人可以澄清为什么JMM无法设置此值吗&#xff1f;附言如果…

【c++】string类的使用

目录 一、标准库中的string类 1、简单介绍string类 2、string类的常用接口注意事项 2.1、string类对象的常用构造 2.2、string类对象的容量操作 2.3、string类对象的访问及遍历操作 2.4、string类对象的修改操作 二、string类的模拟实现 一、标准库中的string类 1、简…

Java - 对象(object) 具体解释

对象(object) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24059545 对象(object)的实例能够是 物理对象(如 人, 车等实物) 或 逻辑对象(如 运动, 健康等); 对象是将状态(数据) 和行为(功能) 组合在一起的软件模块. 类是描写叙述一组相似对象共同…

c/c++ 重载运算符 函数调用运算符

重载运算符 函数调用运算符 把一个类的对象a&#xff0c;当成函数来使用&#xff0c;比如a()&#xff0c;所以需要重载operator()方法。重载了函数调用运算符的类的对象&#xff0c;就是函数对象了。 还有什么是函数对象呢&#xff1f;&#xff1f;&#xff1f; lambda是函数对…

matlab 万能,matlab 万能实用的线性曲线拟合方法

在科学计算和工程应用中&#xff0c;经常会遇到需要拟合一系列的离散数据&#xff0c;最近找了很多相关的文章方法&#xff0c;在这里进行总结一下其中最完整、几乎能解决所有离散参数线性拟合的方法第一步&#xff1a;得到散点数据根据你的实际问题得到一系列的散点例如&#…

mysql函数之SUBSTRING_INDEX(str,/,-1)

SUBSTRING_INDEX的用法&#xff1a; •SUBSTRING_INDEX(str,delim,count) 在定界符 delim 以及count 出现前&#xff0c;从字符串str返回自字符串。若count为正值,则返回最终定界符(从左边开始) 若为-1则是从后往前截取 SELECT substring_index(Hn_P00001, P, -1) -- 结果是…