WPF TextBlock 绑定 换行

简介:

最近有个小需求

需要在textblock中换行

 

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

Xaml:

<TextBlock Text="AAAAA&#13;BBBBB" />
<TextBlock Text="AAAAA&#10;BBBBB" />
<TextBlock >AAAAA<LineBreak />BBBBB</TextBlock>

 

CodeBehind:

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

 

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

 

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

image

 

 

这下杯具了

想到的简单的方法是处理数据源成一个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&#13;{n}BBBBB" });
            l1.Add(new StringData() { Str = "AAAAA&#13;{n}BBBBB" });
            l1.Add(new StringData() { Str = "AAAAA&#13;{n}BBBBB" });
            l1.Add(new StringData() { Str = "AAAAA&#13;{n}BBBBB" });
            ItemsControl1.ItemsSource = l1;
        }
 
最后看看换行效果
 

 

源码下载:

本文转自 sun8134 博客园博客,原文链接: http://www.cnblogs.com/sun8134/p/4191882.html  ,如需转载请自行联系原作者




相关文章
WPF—多重绑定和跨层级绑定
WPF—多重绑定和跨层级绑定
|
C# 数据格式 XML
WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)
原文:WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树) 一、WPF对象级(Window对象)资源的定义与查找 实例一: StaticR...
8101 0
|
9月前
|
C# Windows
WPF技术之TextBlock控件
WPF(Windows Presentation Foundation)的TextBlock控件是用于显示文本的控件。与Label控件相比,TextBlock提供了更多的灵活性和格式化选项。
336 1
|
10月前
|
C# 数据库
WPF中DataGrid控件绑定数据源
WPF中DataGrid控件绑定数据源
124 0
|
C#
WPF更新绑定字段
WPF更新绑定字段
74 0
WPF中给TextBox/TextBlock设置提示文本
WPF中给TextBox/TextBlock设置提示文本
WPF中给TextBox/TextBlock设置提示文本
|
前端开发 C#
WPF 之 数据与命令绑定 (MVVM方式)
WPF 之 数据与命令绑定 (MVVM方式)
164 0
WPF 之 数据与命令绑定 (MVVM方式)
|
C# 前端开发
wpf中的datagrid绑定操作按钮是否显示或者隐藏
如图,需要在wpf中的datagrid的操作那列有个确认按钮,然后在某些条件下确认按钮可见,某些情况下不可见的,放在mvc里直接在cshtml页面中if..else就行了。 但是在wpf里不行。。网上搜索了好久才找到解决方法,原来只是binding那个visiable属性就行了,
6852 0
|
C#
【msdn wpf forum翻译】TextBlock等类型的默认样式(implicit style)为何有时不起作用?
原文:【msdn wpf forum翻译】TextBlock等类型的默认样式(implicit style)为何有时不起作用?原文链接:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/148e95c6-6fb5-4399-8a56-4...
948 0
|
C#
WPF中一个控件绑定另一个控件的属性
原文:WPF中一个控件绑定另一个控件的属性 如同一个Grid中的一个按钮根据另一个按钮的显示与否作出不同的响应: 绑定的时候通过ElementName来指定控件               ...
1809 0