原文:WPF文字描边的解决方法(二)——支持文字竖排和字符间距调整

自前天格式化文本效果出来后,今天又添加文本竖排和调整字符间距的功能。另外,由于上次仓促,没来得及做有些功能的设计时支持,这次也调整好了。

由于本人比较懒,没有重新做,文字竖排和字符间距主要是通过新建继承自StackPanel的FormatedText类逐字符添加StrokeableLabel做的,竖排是用的StackPanel.Orientation来设置的,字符间距主要用的StrokeableLabel.Margin。

对于StrokeableLabel只是添加了设计时支持,其他没有改变,如果对StrokeableLabel不了解请看http://blog.csdn.net/springberlin/article/details/45699625

FormatedText有如下新添属性:

StretchSize:字符间距

TextOrientation:文字排版

下面是效果图

XMAL配置:

  1. <Window x:Class="StrokeableLabelTest.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:wpflib="clr-namespace:BLCTClassLibrary.WpfLib;assembly=BLCTClassLibrary.WpfLib"
  5. Title="MainWindow" Height="422" Width="579">
  6. <Grid ShowGridLines="True">
  7. <Grid.ColumnDefinitions>
  8. <ColumnDefinition Width="auto" />
  9. <ColumnDefinition Width="*" />
  10. </Grid.ColumnDefinitions>
  11. <StackPanel Orientation="Vertical" >
  12. <Label Margin="10" Content="以下是StrokeableLabel类(相对轻量级)"/>
  13. <wpflib:StrokeableLabel Text="测试文本" Fill="Yellow" Stroke="Black" StrokeThickness="0.3" FontWeight="Bold" FontSize="50"/>
  14. <wpflib:StrokeableLabel Text="测试文本" Fill="Yellow" Stroke="Red" StrokeThickness="0.7" FontWeight="DemiBold" FontSize="50">
  15. <wpflib:StrokeableLabel.Effect>
  16. <DropShadowEffect Color="Black" BlurRadius="15" RenderingBias="Quality" Direction="290" ShadowDepth="5" Opacity="1" />
  17. </wpflib:StrokeableLabel.Effect>
  18. </wpflib:StrokeableLabel>
  19. <wpflib:StrokeableLabel Text="测试文本" Fill="White" StrokeThickness="2" FontWeight="Bold" FontSize="50">
  20. <wpflib:StrokeableLabel.Stroke>
  21. <LinearGradientBrush>
  22. <LinearGradientBrush.GradientStops>
  23. <GradientStop Color="Blue" Offset="0.2"/>
  24. <GradientStop Color="Brown" Offset="0.3"/>
  25. <GradientStop Color="PowderBlue" Offset="0.7"/>
  26. <GradientStop Color="Red" Offset="1"/>
  27. </LinearGradientBrush.GradientStops>
  28. </LinearGradientBrush>
  29. </wpflib:StrokeableLabel.Stroke>
  30. </wpflib:StrokeableLabel>
  31. <wpflib:StrokeableLabel Text="测试文本" Stroke="red" StrokeThickness="2" FontWeight="Bold" FontSize="50">
  32. <wpflib:StrokeableLabel.Fill>
  33. <ImageBrush ImageSource="/StrokeableLabelTest;component/Images/20085385922474_2.jpg" />
  34. </wpflib:StrokeableLabel.Fill>
  35. </wpflib:StrokeableLabel>
  36. <wpflib:StrokeableLabel Fill="Transparent" FontSize="50" FontWeight="Light" StrokeThickness="8" Text="测试文本" >
  37. <wpflib:StrokeableLabel.Stroke>
  38. <ImageBrush ImageSource="/StrokeableLabelTest;component/Images/05.jpg" />
  39. </wpflib:StrokeableLabel.Stroke>
  40. </wpflib:StrokeableLabel>
  41. </StackPanel>
  42. <StackPanel Grid.Column="1" Orientation="Vertical" >
  43. <TextBlock Margin="10" Text="以下是FormatedText类(在StrokeableLabel的基础上可以使文字竖排,可以控制字符间距)" TextWrapping="WrapWithOverflow" />
  44. <wpflib:FormatedText StretchSize="-5" TextOrientation="Vertical" HorizontalAlignment="Center" Text="测试文本" Fill="Yellow" Stroke="Black" StrokeThickness="0.3" FontWeight="Bold" FontSize="50"/>
  45. <wpflib:FormatedText StretchSize="-10" HorizontalAlignment="Center" Text="测试文本" Fill="Yellow" Stroke="Black" StrokeThickness="0.3" FontWeight="Bold" FontSize="50"/>
  46. <wpflib:FormatedText StretchSize="20" HorizontalAlignment="Center" Text="测试文本" Fill="Yellow" Stroke="Black" StrokeThickness="0.3" FontWeight="Bold" FontSize="50">
  47. <wpflib:FormatedText.Effect>
  48. <DropShadowEffect Color="Black" BlurRadius="15" RenderingBias="Quality" Direction="290" ShadowDepth="5" Opacity="1" />
  49. </wpflib:FormatedText.Effect>
  50. </wpflib:FormatedText>
  51. </StackPanel>
  52. </Grid>
  53. </Window>

库文件仅贴关键代码,其余请参考源码。库文件中利用StrokeableLabel进行排版以达到横/竖排和字符间距的效果:

  1. private void CreateText(string newStr)
  2. {
  3. this.Children.Clear();
  4. if (newStr == null)
  5. return;
  6. this.Orientation = TextOrientation;
  7. for (int i = 0; i < newStr.Length; i++)
  8. {
  9. if (i < newStr.Length - 1)
  10. addChar(newStr[i], false);
  11. else
  12. addChar(newStr[i], true);
  13. }
  14. }
  15. /// <summary>
  16. /// 添加一个字符
  17. /// </summary>
  18. /// <param name="c"></param>
  19. private void addChar(char c, bool ignore)
  20. {
  21. StrokeableLabel label = new StrokeableLabel();
  22. label.Text = c + "";
  23. label.Fill = this.Fill;
  24. label.Stroke = this.Stroke;
  25. label.StrokeThickness = this.StrokeThickness;
  26. label.FontSize = this.FontSize;
  27. label.FontFamily = this.FontFamily;
  28. label.FontStyle = this.FontStyle;
  29. label.FontWeight = this.FontWeight;
  30. label.FontStretch = this.FontStretch;
  31. if (!ignore)
  32. switch (Orientation)
  33. {
  34. case System.Windows.Controls.Orientation.Horizontal:
  35. label.Margin = new Thickness(0, 0, StretchSize, 0);
  36. break;
  37. case System.Windows.Controls.Orientation.Vertical:
  38. label.Margin = new Thickness(0, 0, 0, StretchSize);
  39. break;
  40. }
  41. label.VerticalAlignment = System.Windows.VerticalAlignment.Center;
  42. label.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
  43. this.Children.Add(label);
  44. }

源码:

http://download.csdn.net/detail/wblct/8708017







WPF文字描边的解决方法(二)——支持文字竖排和字符间距调整的更多相关文章

  1. WPF文字描边的解决方法

    原文:WPF文字描边的解决方法  由于项目原因,今天研究了一下午WPF的文字描边,网上这方面的资料奇少,搞了半天才发现强大的WPF原来不直接支持文字描边啊.最后求助于MSDN,找到了方案,和大家分 ...

  2. echarts图表X轴文字过长解决解决方案:根据文字长度自动旋转

    Echarts 标签中文本内容太长的时候怎么办 ? 关于这个问题搜索一下,有很多解决方案.无非就是 省略(间隔显示).旋转文字方向.竖排展示 前面两种解决方案,就是echarts暴露的: {   ax ...

  3. 使用echart的雷达图的时候,如果文字越界的解决办法记录,标签文字自动换行

    使用echart的雷达图的时候,如果文字越界的解决办法记录,标签文字自动换行 前几天项目中有一个图表的是用echart生成的,遇到一个问题,就是在手机端显示的售时候,如果文字太长就会超出div,之前的 ...

  4. FusionCharts使用问题及解决方法(二)-FusionCharts常见问题大全

    在上文中,我们介绍了FusionCharts常见问题(FAQ)的解决方法,本文将一同讨论FusionCharts使用者面临的一些复杂问题的解决方法. 如何启用JavaScript调试模式? 要启用Ja ...

  5. Unity导出APk出错解决方法二

    错误提示(需得打开编辑器log文件才能看到全部log,Unity3d只显示一部分): Error building Player: CommandInvokationFailure: Unable t ...

  6. RecyclerView嵌套TextView时显示文字不全的解决方法之一

    先描述一下这个小bug:简单的TextView嵌套RecyclerView作为itemView时,可能会在文本中出现布局覆盖的现象,itemView的布局其实很简单,就是一个RelativeLayou ...

  7. PHP中Strict Standards错误解决方法二

    在PHP5.3.3 中安装wordpress 3.0.1 ,在安装时出现错误:Strict Standards: PHP Strict Standards: Declaration of Walker ...

  8. Xcode真机测试could not find developer disk image解决方法(支持iOS9.2)

    这个问题开发者经常碰到,因为当我们更新手机iOS版本的时候,可能我们开发人员因为项目的需要等原因并一定愿意更新xcode到最新版本.但是老版本的xcode极有可能不支持最新的iOS版本,也有一些旧的i ...

  9. input输入框只允许输入数字/ 数字+小数点/ 文字+字母/ 等解决方法

    1.只允许输入数字: <input type="text" onkeyup="this.value=this.value.replace(/[^0-9]/g,'') ...

随机推荐

  1. js进阶 12-7 如何知道你是从哪个元素移动到当前元素与事件调用时如何添加额外数据

    js进阶 12-7 如何知道你是从哪个元素移动到当前元素与事件调用时如何添加额外数据 一.总结 一句话总结:event的relatedTarget属性和data属性. 1.如何知道你是从哪个元素移动到 ...

  2. Textillate.js有什么用及使用实例

    Textillate.js有什么用及使用实例 一.总结 一句话总结:Textillate.js – 实现动感的 CSS3 文本动画的简单插件 二.textillate.js 文字动画 textilla ...

  3. Android系统开发(7)——标准I/O与文件锁

    一.常用函数 fopen: FILE *fopen(const char *filename, const char *mode); fread: size_t  fread(void *ptz, s ...

  4. 0、驱动及应用小技巧、uboot指令及环境变量配置、linux常用命令

    (内核make menuconfig之后,通过insmod安装的驱动都应该重新make,可能会出现一些莫名的问题) (nor flash/SDRAM/DM9000都受内存控制器控制,需要配置内存控制器 ...

  5. 黑马程序猿——15,String,StringBuffer,基本数据类型包装对象

    ------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  6. 交换排序(java)

    package exchange_sort; import java.util.Random; /*各类交换排序  * ------数据存储范围1~s.length-1 ------  *主要包含   ...

  7. [乐意黎原创] eclipse Kepler Selected SVN connector library is not available or cannot be loaded

    问题描写叙述:已经安装了subversive,可是在从SCM导入maven项目时.还是提示报错(如标题),依据报错原因发如今Team>SVN中确实没有svn连接器. 折腾了半天, 硬是没有结果. ...

  8. poj 2955 Brackets 括号匹配 区间dp

    题意:最多有多少括号匹配 思路:区间dp,模板dp,区间合并. 对于a[j]来说: 刚開始的时候,转移方程为dp[i][j]=max(dp[i][j-1],dp[i][k-1]+dp[k][j-1]+ ...

  9. MS SQL Server的STRING_SPLIT和STRING_AGG函数

    在较新版本的SQL中,出现有2个函数,STRING_SPLIT和STRING_AGG,前者是把带有分隔的字符串转换为表,而后者却是把表某一表转换为以某种字符分隔的字符串. 如下面: DECLARE @ ...

  10. [Redux] Important things in Redux

    Root Smart component can be overloaded, divide 'smart' component wisely & using Provider. Proble ...