最近有个小需求

需要在textblock中换行

其实textblock换行有很多写法,比如:

Xaml:

<TextBlock Text="AAAAA
BBBBB" />
<TextBlock Text="AAAAA BBBBB" />
<TextBlock >AAAAA<LineBreak />BBBBB</TextBlock>

CodeBehind:

this.TextBlock1.Text = "AAAAAAA\nBBBBBBBB";

绑定的时候其实也很简单,只要用\n就可以了

但是有时候情况比较特殊,比如我们这个程序同时还将字符绑定给了一个 MediaElement ,这个时候用\n,则会提示“路径非法字符”…

这下杯具了

想到的简单的方法是处理数据源成一个List<T>,不过在已经乱成一锅粥的代码里貌似改动影响有点大…

在不改动数据源的情况下,只能从TextBlock上想办法了

然后就想到了 附加属性http://msdn.microsoft.com/zh-cn/library/ms749011(v=vs.110).aspx

利用附加属性和转换器,来将TextBlock拆成<Run />和<LineBreak />

首先先新建一个转换器,将数据字符串根据分隔符(我设置的分隔符为{n})来拆分成<Run />和<LineBreak />,返回List<Inline>

    public class TextBlockLineBreakConvertor : IValueConverter
{
public object Convert(object value, Type targetType,object parameter, CultureInfo culture)
{
var inlines = new List<Inline>();
if (value != null)
{
var textblocklines =value.ToString().Split(new string[] { "{n}" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in textblocklines)
{
inlines.Add(new Run() { Text = line });
if (textblocklines.ToList().IndexOf(line) < textblocklines.Length - 1)
{
//加入换行
inlines.Add(new LineBreak());
}
}
}
return inlines;
} public object ConvertBack(object value, Type targetType,object parameter, CultureInfo culture)
{
return value;
}
}

然后我们新建一个附加属性 InlineList

        public static readonly DependencyProperty TextBlockLineBreakProperty =
DependencyProperty.RegisterAttached(
"InlineList",
typeof(List<Inline>),
typeof(MainWindow),
new PropertyMetadata(null, OnLineBreakPropertyChanged));

附加属性来将转换器转换成的 List<Inline> 赋值给界面元素

        private static void OnLineBreakPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var tb = obj as TextBlock;
if (tb != null)
{
tb.Inlines.Clear();
var inlines = e.NewValue as List<Inline>;
if (inlines != null)
{
inlines.ForEach(inl => tb.Inlines.Add((inl)));
}
}
}

然后给 TextBlock 添加上我们建立的附加属性

        public static string GetInlineList(TextBlock element)
{
if (element != null)
{
return element.GetValue(TextBlockLineBreakProperty) as string;
}
else
{
return string.Empty;
}
}
public static void SetInlineList(TextBlock element, string value)
{
if (element != null)
{
element.SetValue(TextBlockLineBreakProperty, value);
}
}
 
最后我们来修改下页面上的数据绑定
<TextBlock local:MainWindow.InlineList="{Binding Str,Converter={StaticResource lineBreakConverter}}"  TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>
 
最后添加绑定数据
        private void Window_Loaded(object sender, RoutedEventArgs e)
{
List<StringData> l1 = new List<StringData>();
l1.Add(new StringData() { Str = "AAAAA {n}BBBBB" });
l1.Add(new StringData() { Str = "AAAAA {n}BBBBB" });
l1.Add(new StringData() { Str = "AAAAA {n}BBBBB" });
l1.Add(new StringData() { Str = "AAAAA {n}BBBBB" });
ItemsControl1.ItemsSource = l1;
}
 
最后看看换行效果
 

源码下载:

WPF TextBlock 绑定 换行的更多相关文章

  1. WPF TextBlock 文本换行的两种方式

    第一种: <TextBlock> This is line 1.<LineBreak/> This is line 2. </TextBlock> 第二种 < ...

  2. WPF中TextBlock文本换行与行间距

    原文:WPF中TextBlock文本换行与行间距 换行符: C#代码中:\r\n 或  \r 或 \n XAML中: 或 注:\r 回车 (carriage return 缩写),\n 新行 (new ...

  3. WPF 元素绑定

    1.什么是数据绑定数据绑定是一种关系,WPF程序从源对象中提取一些信息,并根据这些信息设置目标对象的属性,目标属性作为依赖项属性.源对象可以是任何内容,可以是另一个wpf内容,甚至是自行创建的纯数据对 ...

  4. WPF多路绑定

    WPF多路绑定 多路绑定实现对数据的计算,XAML:   引用资源所在位置 xmlns:cmlib="clr-namespace:CommonLib;assembly=CommonLib&q ...

  5. WPF元素绑定

    原文:WPF元素绑定 数据绑定简介:数据绑定是一种关系,该关系告诉WPF从源对象提取一些信息,并用这些信息设置目标对象的属性.目标属性是依赖项属性.源对象可以是任何内容,从另一个WPF元素乃至ADO. ...

  6. 【WPF】最近在学习wpf 的绑定,,

    最近在学习wpf 的绑定,,1.简单的说就是版前端和后端用自己的方法给分开了2.baseVm 模型 baseCmd 命令3.命令传参修改的只是界面里的属性,而不修改其它的值4.前端改变后端, 后端改变 ...

  7. wpf直接绑定xml生成应用程序

    目的:在vs2010下用wpf完成一个配置工具,配置文件为xml格式,xml文件作为数据源,直接和wpf前台绑定,生成exe后,运行exe能够加载同路径下的xml配置文件并显示 xml文件在项目中的设 ...

  8. WPF中的换行符

    原文:WPF中的换行符 WPF中UI上和后台代码中的换行符不同. 其中: XAML中为 C#代码中为 \r\n 或者: Environment.NewLine 版权声明:本文为博主原创文章,未经博主允 ...

  9. WPF DataGrid绑定一个组合列

    WPF DataGrid绑定一个组合列 前台: <Page.Resources>        <local:InfoConverter x:Key="converter& ...

随机推荐

  1. 必填项(required)

    当你设计表单时,你可以指定某些选项为必填项(required),只有当用户填写了该选项后,用户才能够提交表单. 例如,如果你想把一个文本输入字段设置为必填项,在你的input元素中加上required ...

  2. python递归次数和堆栈溢出问题

    在做递归的时候,测试了一下python的递归能力. 如果不设置递归次数的话,大概只能在992次左右,就会出现错误:RuntimeError: maximum recursion depth excee ...

  3. SQL Develop SSH远程连接

    目前碰到了本机无法直接连接数据库服务器,然后mac上可以选择的oracle客户端又很少,直到知道了可以ssh远程到跳板机上,然后进行连接. 在跳板机上输入命令如下: ssh -L 0.0.0.0:65 ...

  4. AIX之ASM存储扩容

    ASM存储扩容操作其实很简单,无非就是向DiskGroup(简称DG)里添加物理磁盘,增加DG的存储空间.说来简单,其实操作过程中有很多小细节要注意,否则,带来的后果是灾难性的. ASM扩容操作步骤( ...

  5. 想抛就抛:Application_Error中统一处理ajax请求执行中抛出的异常

    女朋友不是想抛就抛,但异常却可以,不信请往下看. 今天在MVC Controller中写代码时,纠结了一下: public async Task<ActionResult> Save(in ...

  6. Hive性能优化

    1.概述 继续<那些年使用Hive踩过的坑>一文中的剩余部分,本篇博客赘述了在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题.下面开始本篇文章的优化介绍. 2.介绍 首先 ...

  7. 分享我用Qt开发的应用程序【一】,附绿色版下载,以后会慢慢公布源码

    写在前面: 1.第一版的代码还有些烂,等功能开发齐全了,做一次重构,再慢慢分享代码 2.邮箱功能.自动升级功能还没有做,笔记功能和备忘功能是好用的,大家如果不嫌弃,可以先用起来 3.笔记功能目前还不能 ...

  8. [MFC] MFC音乐播放器 傻瓜级教程 网络 搜索歌曲 下载

    >目录< >——————————————————————< 1.建立工程  1.建立一个MFC工程,命名为Tao_Music 2.选择为基本对话框 3.包含Windows So ...

  9. Qt 5.3.1 版本应用程序的发布问题

    问题描述:用过Qt的朋友,都知道,完成的Qt程序,只能在QT环境里运行.在debug环境里,没有配置环境路线的情况下,必须包含多个dll库,然而每个dll库的大小确实很大的.但有时候还是会失败的,在一 ...

  10. VS 2008 创建MFC程序对话框的步骤

    用过不少编程语言,可是刚开始学的时候最容易忘记一些简单的流程或者生疏了.那么这里就说说VS 2008 创建MFC程序对话框的步骤.我主要是android开发方面的.平时使用jni调用不少c++代码.所 ...