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& ...
随机推荐
- Java文件内容的复制
package a.ab; import java.io.*; public class FileReadWrite { public static void main(String[] args) ...
- Programming Assignment 2: Randomized Queues and Deques
实现一个泛型的双端队列和随机化队列,用数组和链表的方式实现基本数据结构,主要介绍了泛型和迭代器. Dequeue. 实现一个双端队列,它是栈和队列的升级版,支持首尾两端的插入和删除.Deque的API ...
- Extjs的GridPanel的RowExpander的扩展
对Extjs的grid使用,有时候单单使用其中的某些组.或某些行是远远不够的,还需要对行进行一些扩展,如:与filters相似的row扩展控件,如下 这个控件,我也是从网上找的小例子,按照其内部的某些 ...
- QQ摄像头读取条码
跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手—打开新的Image Acquisitio ...
- Winform(C#.NET)自动更新组件的使用及部分功能实现(续)
接昨天的文章Winform(C#.NET)自动更新组件的使用及部分功能实现 强制更新的实现部分: 将DownloadConfirm窗体修改成单纯的类 public class DownloadConf ...
- 轻松实现ajax登录时让浏览器保存密码
将登录页面由form提交改为ajax提交,发现一个副作用——登录时浏览器不会提示是否保存密码,这样每次登录都要输入用户名/密码. html代码如下: <script> $(function ...
- 39行代码实现JS HTML模板(轻量+高效+易用)
otmpl 是一个轻量级前端模版(仅有39行无压缩代码,支持缓存),所用指令仅需[#...#]和{#...#},前者包含需要输出html语句,后者包含js变量. 支持javascript完整语法,你可 ...
- [MFC] MFC 用mciSendString加载WAV资源文件
@ - @ FIRDST:为什么不用路径加载? 因为mciSendString函数不支持加载资源文件里的WAV资源,如果按路径加载,那么你的WAV就暴露在exe之外,无法实现音频资源的很好保护 ...
- 选择哪种方式进行SharePoint的备份
关于SharePoint的备份还原功能,大家可能都有所了解.但是SharePoint一共有多少种备份方式呢,哪种备份方式是更适合你的呢,本文主要为大家梳理,并且深入的研究一下常见的几种备份方式,以便大 ...
- ServiceStack 概念
目录 ServiceStack 概念 ServiceStack Web Service 创建与调用简单示列 ServiceStack ServiceStack是.Net和Mono的开源框架,相对WCF ...
