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

简介: 原文:WPF文字描边的解决方法(二)——支持文字竖排和字符间距调整 自前天格式化文本效果出来后,今天又添加文本竖排和调整字符间距的功能。
原文: WPF文字描边的解决方法(二)——支持文字竖排和字符间距调整

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

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

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

FormatedText有如下新添属性:

StretchSize:字符间距

TextOrientation:文字排版

下面是效果图

XMAL配置:

<Window x:Class="StrokeableLabelTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpflib="clr-namespace:BLCTClassLibrary.WpfLib;assembly=BLCTClassLibrary.WpfLib"
        Title="MainWindow" Height="422" Width="579">
    <Grid ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <StackPanel Orientation="Vertical" >
            <Label Margin="10"  Content="以下是StrokeableLabel类(相对轻量级)"/>
            <wpflib:StrokeableLabel Text="测试文本" Fill="Yellow" Stroke="Black" StrokeThickness="0.3" FontWeight="Bold" FontSize="50"/>
            <wpflib:StrokeableLabel Text="测试文本" Fill="Yellow" Stroke="Red" StrokeThickness="0.7" FontWeight="DemiBold" FontSize="50">
                <wpflib:StrokeableLabel.Effect>
                    <DropShadowEffect Color="Black" BlurRadius="15" RenderingBias="Quality" Direction="290" ShadowDepth="5" Opacity="1"  />
                </wpflib:StrokeableLabel.Effect>
            </wpflib:StrokeableLabel>
            <wpflib:StrokeableLabel Text="测试文本" Fill="White" StrokeThickness="2" FontWeight="Bold" FontSize="50">
                <wpflib:StrokeableLabel.Stroke>
                    <LinearGradientBrush>
                        <LinearGradientBrush.GradientStops>
                            <GradientStop Color="Blue" Offset="0.2"/>
                            <GradientStop Color="Brown" Offset="0.3"/>
                            <GradientStop Color="PowderBlue" Offset="0.7"/>
                            <GradientStop Color="Red" Offset="1"/>
                        </LinearGradientBrush.GradientStops>
                    </LinearGradientBrush>
                </wpflib:StrokeableLabel.Stroke>
            </wpflib:StrokeableLabel>
            <wpflib:StrokeableLabel Text="测试文本" Stroke="red" StrokeThickness="2"  FontWeight="Bold" FontSize="50">
                <wpflib:StrokeableLabel.Fill>
                    <ImageBrush ImageSource="/StrokeableLabelTest;component/Images/20085385922474_2.jpg" />
                </wpflib:StrokeableLabel.Fill>
            </wpflib:StrokeableLabel>
            <wpflib:StrokeableLabel Fill="Transparent" FontSize="50" FontWeight="Light" StrokeThickness="8" Text="测试文本" >
                <wpflib:StrokeableLabel.Stroke>
                    <ImageBrush ImageSource="/StrokeableLabelTest;component/Images/05.jpg" />
                </wpflib:StrokeableLabel.Stroke>
            </wpflib:StrokeableLabel>
        </StackPanel>
        <StackPanel Grid.Column="1" Orientation="Vertical" >
            <TextBlock Margin="10"  Text="以下是FormatedText类(在StrokeableLabel的基础上可以使文字竖排,可以控制字符间距)" TextWrapping="WrapWithOverflow" />
            <wpflib:FormatedText StretchSize="-5" TextOrientation="Vertical" HorizontalAlignment="Center" Text="测试文本" Fill="Yellow" Stroke="Black" StrokeThickness="0.3" FontWeight="Bold" FontSize="50"/>
            <wpflib:FormatedText StretchSize="-10" HorizontalAlignment="Center" Text="测试文本" Fill="Yellow" Stroke="Black" StrokeThickness="0.3" FontWeight="Bold" FontSize="50"/>
            <wpflib:FormatedText StretchSize="20" HorizontalAlignment="Center" Text="测试文本" Fill="Yellow" Stroke="Black" StrokeThickness="0.3" FontWeight="Bold" FontSize="50">
                <wpflib:FormatedText.Effect>
                    <DropShadowEffect Color="Black" BlurRadius="15" RenderingBias="Quality" Direction="290" ShadowDepth="5" Opacity="1"  />
                </wpflib:FormatedText.Effect>
            </wpflib:FormatedText>
        </StackPanel>
    </Grid>
</Window>


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

        private void CreateText(string newStr)
        {
            this.Children.Clear();
            if (newStr == null)
                return;
            this.Orientation = TextOrientation;

            for (int i = 0; i < newStr.Length; i++)
            {
                if (i < newStr.Length - 1)
                    addChar(newStr[i], false);
                else
                    addChar(newStr[i], true);
            }
        }

        /// <summary>
        /// 添加一个字符
        /// </summary>
        /// <param name="c"></param>
        private void addChar(char c, bool ignore)
        {
            StrokeableLabel label = new StrokeableLabel();
            label.Text = c + "";
            label.Fill = this.Fill;
            label.Stroke = this.Stroke;
            label.StrokeThickness = this.StrokeThickness;
            label.FontSize = this.FontSize;
            label.FontFamily = this.FontFamily;
            label.FontStyle = this.FontStyle;
            label.FontWeight = this.FontWeight;
            label.FontStretch = this.FontStretch;
            if (!ignore)
                switch (Orientation)
                {
                    case System.Windows.Controls.Orientation.Horizontal:
                        label.Margin = new Thickness(0, 0, StretchSize, 0);
                        break;
                    case System.Windows.Controls.Orientation.Vertical:
                        label.Margin = new Thickness(0, 0, 0, StretchSize);
                        break;
                }
            label.VerticalAlignment = System.Windows.VerticalAlignment.Center;
            label.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
            this.Children.Add(label);
        }


源码:

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







目录
相关文章
|
算法 容器 数据可视化
WPF_界面_图片/界面/文字模糊解决之道整理
原文:WPF_界面_图片/界面/文字模糊解决之道整理 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010265681/article/details/76651792 图片模糊: 图片尺寸:  检查图片,png, DPI=72,Stretch="None",原图尺寸和xaml里面写的尺寸一致。
1304 0
|
C#
好玩的WPF第一弹:窗口抖动+边框阴影效果+倒计时显示文字
原文:好玩的WPF第一弹:窗口抖动+边框阴影效果+倒计时显示文字 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.
1042 0
|
C# 开发者
WPF 程序无法触摸操作?我们一起来找原因和解决方法!
原文:WPF 程序无法触摸操作?我们一起来找原因和解决方法! 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
1326 0
|
C#
WPF中让TextBlock每一个字符显示不同的颜色
原文:WPF中让TextBlock每一个字符显示不同的颜色 XAML代码: R G B ...
1756 0
|
C#
WPF图片放大后模糊的解决方法
原文:WPF图片放大后模糊的解决方法 WPF中显示图片的方式很多,可以用Image控件来显示图像,或者直接设置一个控件的Background。
1351 0
|
C#
【C#/WPF】TextBlock/TextBox/Label编辑文字的问题
原文:【C#/WPF】TextBlock/TextBox/Label编辑文字的问题 标题有点描述不清,就当是为了方便自己用时易于搜索到。
1391 0
|
C# Windows
WPF中的文字修饰——上划线,中划线,基线与下划线
原文:WPF中的文字修饰——上划线,中划线,基线与下划线 我们知道,文字的修饰包括:空心字、立体字、划线字、阴影字、加粗、倾斜等。这里只说划线字的修饰方式,按划线的位置,我们可将之分为:上划线、中划线、基线与下划线。
1510 0
|
C#
正则表达式——WPF输入控件TextBox 限定输入特定字符
原文:正则表达式——WPF输入控件TextBox 限定输入特定字符 概念: 正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤逻辑。
2177 0
|
C#
WPF控件TextBlock中文字自动换行
原文:WPF控件TextBlock中文字自动换行 在很多的WPF项目中,往往为了追求界面的美观,需要控制控件中文字的换行显示,现对TextBlock控件换行的实现方式进行总结,希望大家多多拍砖!!! 1.
2882 0
|
C#
WPF——TargetNullValue(如何在绑定空值显示默认字符)
原文:WPF——TargetNullValue(如何在绑定空值显示默认字符) 说明:在数据绑定时,如果有些字段为空值,那么在数据绑定时可以用默认值来显示为空的字段。   1 2 3 4 5 ...
1055 0