WPF TextBlock 绑定 换行
最近有个小需求
需要在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 绑定 换行的更多相关文章
- WPF TextBlock 文本换行的两种方式
第一种: <TextBlock> This is line 1.<LineBreak/> This is line 2. </TextBlock> 第二种 < ...
- WPF中TextBlock文本换行与行间距
原文:WPF中TextBlock文本换行与行间距 换行符: C#代码中:\r\n 或 \r 或 \n XAML中: 或 注:\r 回车 (carriage return 缩写),\n 新行 (new ...
- WPF 元素绑定
1.什么是数据绑定数据绑定是一种关系,WPF程序从源对象中提取一些信息,并根据这些信息设置目标对象的属性,目标属性作为依赖项属性.源对象可以是任何内容,可以是另一个wpf内容,甚至是自行创建的纯数据对 ...
- WPF多路绑定
WPF多路绑定 多路绑定实现对数据的计算,XAML: 引用资源所在位置 xmlns:cmlib="clr-namespace:CommonLib;assembly=CommonLib&q ...
- WPF元素绑定
原文:WPF元素绑定 数据绑定简介:数据绑定是一种关系,该关系告诉WPF从源对象提取一些信息,并用这些信息设置目标对象的属性.目标属性是依赖项属性.源对象可以是任何内容,从另一个WPF元素乃至ADO. ...
- 【WPF】最近在学习wpf 的绑定,,
最近在学习wpf 的绑定,,1.简单的说就是版前端和后端用自己的方法给分开了2.baseVm 模型 baseCmd 命令3.命令传参修改的只是界面里的属性,而不修改其它的值4.前端改变后端, 后端改变 ...
- wpf直接绑定xml生成应用程序
目的:在vs2010下用wpf完成一个配置工具,配置文件为xml格式,xml文件作为数据源,直接和wpf前台绑定,生成exe后,运行exe能够加载同路径下的xml配置文件并显示 xml文件在项目中的设 ...
- WPF中的换行符
原文:WPF中的换行符 WPF中UI上和后台代码中的换行符不同. 其中: XAML中为 C#代码中为 \r\n 或者: Environment.NewLine 版权声明:本文为博主原创文章,未经博主允 ...
- WPF DataGrid绑定一个组合列
WPF DataGrid绑定一个组合列 前台: <Page.Resources> <local:InfoConverter x:Key="converter& ...
随机推荐
- ubuntu 挂载新硬盘
http://www.cnblogs.com/hnrainll/archive/2012/02/27/2369331.html
- Ajax跨域请求ashx文件与Webservice文件
前台页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1 ...
- 重启EBS
http://www.cnblogs.com/toowang/archive/2012/03/28/2421275.html 概述步骤(此操作没有停止数据库): 1.登陆FTP,终止应用:cd $CO ...
- [转]Flash Socket通信的安全策略
昨天做测试的时候遇到一个问题,做好的SWF在Flash AS3中调试通过,但是发布到html中之后就无法得到数据了.查了一些资料之后找到了解决办法.这里感谢 剑心 提供帮助,以及同事若水三千提供Jav ...
- 对象池与.net—从一个内存池实现说起
本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...
- 轻易实现基于linux或win运行的聊天服务端程序
对于不了解网络编程的开发人员来说,编写一个良好的服务端通讯程序是一件比较麻烦的事情.然而通过EC这个免费组件你可以非常简单地构建一个基于linux或win部署运行的网络服务程序.这种便利性完全得益于m ...
- 在 .NET 4.5 中反射机制的变更
反射机制(Reflection)通常会涉及到3中场景: 运行时反射 场景:可以检索已加载程序集.类型.对象.实例和方法调用的元数据(Metadata). .NET 支持情况:支持 仅供静态分析的反射 ...
- Unity3D——相机跟随物体移动
public Transform target; public float moveSmooth=5f; Vector3 offset; void Start () { offset = transf ...
- [异常] MyEclipse Deploy点不开 An internal error occurred during: "Launching MVC on Tomcat 6.x". java.lang.NullPointerException
>_<" 今天做struts时,工程写好了,可是点击MyEclipse上面的Delopy不会跳出常规的窗口,导致各种坑~ >_<" 如果直接运行还出现下面的 ...
- [ACM_图论] ZOJ 3708 [Density of Power Network 线路密度,a->b=b->a去重]
The vast power system is the most complicated man-made system and the greatest engineering innovatio ...
