最近有个小需求

需要在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. poj3264 - Balanced Lineup(RMQ_ST)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 45243   Accepted: 21240 ...

  2. 弹出JS提示框

    弹出JS提示框Page.ClientScript.RegisterStartupScript(typeof(string), "msg", "<script> ...

  3. ios图片的压缩

    最近做图片的上传,由于项目中的涉及到的图片是从相册和相机中拍照获取的,所以图片的类型不一定,有些是jpg有些是png,另外随着现在设备相继的像素越来越高,所拍摄的图片也越来越到,在图片上传之前我们是需 ...

  4. php乱码

    1:php 编码是utf-8 但是接口需要是gbk 这么办?? $message = "你的微点管理地址为:".$shortUrl." [请保存信息]"; // ...

  5. IFrame 高度自适应的两种方式 .

    iframe 高度自适应一般是指: iframe 本身的高度 =  内容高度. 这样做可以使最外层不出现滚动条. 如果网页内容使用了Ajax方式填充内容的话. 由于内容是动态的. 以上方式应该变为: ...

  6. Android开发笔记

    Android 中国SDK: http://wear.techbrood.com/ Android SDK Manager 代理设置: http://www.cnblogs.com/sunzn/p/4 ...

  7. Android开源项目分包方式学习(eoe、oschina、github)

    总感觉Android中关于分包的文章很少,或者几乎可以说没有.但是合理地分包,又可以使整个项目模块化,减少包与包之间的依赖,让整个项目的框架更加清晰,更利于后续功能的拓展. 因为没有相关的文章,所以这 ...

  8. [Java Web整合开发王者归来·刘京华] 2、 Java Web开发概述

    1.Web相关概念 1-1.胖客户与瘦客户 >_<" RCP的定义及优缺点:       >_<"TCP的定义及优缺点:             1-2.B ...

  9. SVN中Branch的创建与合并

    在使用源代码版本控制工具时,最佳实践是一直保持一个主干版本.但是为了应付实际开发中的各种情况,适时的开辟一些分支也是很有必要的.比如在持续开发新功能的同时,需要发布一个新版本,那么就需要从开发主干中建 ...

  10. MySQL笔记汇总

    [目录] MySQL笔记汇总 一.mysql简介 数据简介 结构化查询语言 二.mysql命令行操作 三.数据库(表)更改 表相关 字段相关 索引相关 表引擎操作 四.数据库类型 数字型 字符串型 日 ...