最近有个小需求

需要在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. UIScrollView滚动视图

    一.基本知识 1.初始化 UIScrollView #import "ViewController.h" #define WIDTH[[UIScreen mainScreen]bo ...

  2. ORGANIZATION

    Leader:  Ming Xiang Ph.D students:  Bo Yang Yupei Zhang M.Eng. students: Cheng Feng Jinquan Du Youli ...

  3. SQL Server 利用锁提示优化Row_number()-程序员需知

    网站中一些老页面仍采用Row_number类似的开窗函数进行分页处理,此时如果遭遇挖坟帖的情形可能就需要漫长的等待且消耗巨大.这里给大家介绍根据Row_number()特性采用特定锁Hint提升查询速 ...

  4. Fiddler:在PC和移动设备上抓取HTTPS数据包

    Fiddler是一个免费的Web调试代理,支持任何浏览器.系统以及平台.这个工具是进行Web和App网络开发的必备工具,戳此处下载. 根据Fiddler官网的描述,具有以下六大特点: Web调试 性能 ...

  5. LoadTest内存和线程Troubleshooting实战

    在端午节放假的三天中,我对正在开发的 Service 进行了 LoadTest,尝试在增大压力的条件下发现问题. 该 Service 为独立进程的 WCF 服务,宿主于 WindowsService, ...

  6. paip.提升中文分词准确度---新词识别

    paip.提升中文分词准确度---新词识别 近来,中文每年大概出现800---1仟个新的词.. 60%的分词错误是由新词导致的 作者Attilax  艾龙,  EMAIL:1466519819@qq. ...

  7. 更改Linux默认栈空间的大小

    有时候在Linux写C++程序处理大量的数据,程序内部需要分配很大的数组来存放一些数据,但有时候分配的数组太大的话运行时会出现段错误.这种情况可能是分配的数组大小超过了Linux系统的默认栈空间的大小 ...

  8. Vue.js:轻量高效的前端组件化方案(转载)

    摘要:Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在GitHub上已经有5000+的star.本文将从各方面对Vue ...

  9. Objective-C 高性能的循环

    Cocoa编程的一个通常的任务是要去循环遍历一个对象的集合  (例如,一个 NSArray, NSSet 或者是 NSDictionary). 这个看似简单的问题有广泛数量的解决方案,它们中的许多不乏 ...

  10. 巧用Windows 7计划任务设置定时提醒

    Windows 7系统有个“计划任务”功能,一般人都很少使用.其实,“计划任务”是系统自带的一个很实用的功能,比如说,这个功能可以设置定时提醒,这样在使用电脑时就不会因为太过投入而导致错过重要的事务. ...