博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF自定义空心文字
阅读量:5130 次
发布时间:2019-06-13

本文共 10282 字,大约阅读时间需要 34 分钟。

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

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

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

 

1     public class OutlinedText : FrameworkElement, IAddChild  2     {  3         ///   4         /// 静态构造函数  5         ///   6         static OutlinedText()  7         {  8             DefaultStyleKeyProperty.OverrideMetadata(typeof(OutlinedText), new FrameworkPropertyMetadata(typeof(OutlinedText)));  9         } 10  11  12         #region Private Fields 13  14         ///  15         /// 文字几何形状 16         ///  17         private Geometry m_TextGeometry; 18  19         #endregion 20  21  22         #region Private Methods 23  24         ///       25         /// 当依赖项属性改变文字无效时,创建新的空心文字对象来显示。 26         ///       27         ///       28         ///       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         ///       43         /// 重写绘制文字的方法。    44         ///       45         /// 空心文字控件的绘制上下文。      46         protected override void OnRender(DrawingContext drawingContext) 47         { 48             //CreateText(); 49             // 基于设置的属性绘制空心文字控件。          50             drawingContext.DrawGeometry(Fill, new Pen(Stroke, StrokeThickness), m_TextGeometry); 51         } 52  53         ///       54         /// 基于格式化文字创建文字的几何轮廓。     55         ///       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         ///  84         /// 指定将文本约束为特定宽度 85         ///  86         public double MaxTextWidth 87         { 88             get { return (double)GetValue(MaxTextWidthProperty); } 89             set { SetValue(MaxTextWidthProperty, value); } 90         } 91         ///  92         /// 指定将文本约束为特定宽度依赖属性 93         ///  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         ///  99         /// 指定将文本约束为特定高度100         /// 101         public double MaxTextHeight102         {103             get { return (double)GetValue(MaxTextHeightProperty); }104             set { SetValue(MaxTextHeightProperty, value); }105         }106         /// 107         /// 指定将文本约束为特定高度依赖属性108         /// 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         ///      114         /// 指定字体是否加粗。   115         ///      116         public bool Bold117         {118             get { return (bool)GetValue(BoldProperty); }119             set { SetValue(BoldProperty, value); }120         }121         ///      122         /// 指定字体是否加粗依赖属性。    123         ///      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         ///      129         /// 指定填充字体的画刷颜色。    130         ///      131         /// 132         public Brush Fill133         {134             get { return (Brush)GetValue(FillProperty); }135             set { SetValue(FillProperty, value); }136         }137         ///      138         /// 指定填充字体的画刷颜色依赖属性。    139         ///      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         ///      145         /// 指定文字显示的字体。   146         ///     147         public FontFamily Font148         {149             get { return (FontFamily)GetValue(FontProperty); }150             set { SetValue(FontProperty, value); }151         }152         ///      153         /// 指定文字显示的字体依赖属性。     154         ///      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         ///      160         /// 指定字体大小。161         ///      162         public double FontSize163         {164             get { return (double)GetValue(FontSizeProperty); }165             set { SetValue(FontSizeProperty, value); }166         }167         ///      168         /// 指定字体大小依赖属性。     169         ///      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         ///      175         /// 指定字体是否显示斜体字体样式。  176         ///      177         public bool Italic178         {179             get { return (bool)GetValue(ItalicProperty); }180             set { SetValue(ItalicProperty, value); }181         }182         ///      183         /// 指定字体是否显示斜体字体样式依赖属性。   184         ///      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         ///      190         /// 指定绘制空心字体边框画刷的颜色。    191         ///      192         public Brush Stroke193         {194             get { return (Brush)GetValue(StrokeProperty); }195             set { SetValue(StrokeProperty, value); }196         }197         ///      198         /// 指定绘制空心字体边框画刷的颜色依赖属性。    199         ///      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         ///      205         /// 指定空心字体边框大小。  206         ///      207         public ushort StrokeThickness208         {209             get { return (ushort)GetValue(StrokeThicknessProperty); }210             set { SetValue(StrokeThicknessProperty, value); }211         }212         ///      213         /// 指定空心字体边框大小依赖属性。      214         ///      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         ///     221         /// 指定要显示的文字字符串。  222         ///      223         public string Text224         {225             get { return (string)GetValue(TextProperty); }226             set { SetValue(TextProperty, value); }227         }228         ///      229         /// 指定要显示的文字字符串依赖属性。  230         ///      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         #endregion239 240 241         #region Public Methods242 243         /// 244         /// 添加子对象。245         /// 246         /// 要添加的子对象。247         public void AddChild(Object value)248         { }249 250         /// 251         /// 将节点的文字内容添加到对象。252         /// 253         /// 要添加到对象的文字。254         public void AddText(string value)255         {256             Text = value;257         }258 259         #endregion260     }

 

 

 

转载于:https://www.cnblogs.com/leolion/p/4965885.html

你可能感兴趣的文章
java SE :标准输入/输出
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
VC6.0调试技巧(一)(转)
查看>>
php match_model的简单使用
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
STM32单片机使用注意事项
查看>>
js window.open 参数设置
查看>>
032. asp.netWeb用户控件之一初识用户控件并为其自定义属性
查看>>
移动开发平台-应用之星app制作教程
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
Solaris11修改主机名
查看>>