string属性中的换行符

当它被设置为一个属性时,如何添加一个换行符到文本,即:

<TextBlock Text="Stuff on line1 \n Stuff on line2" /> 

分解成爆炸格式不是我的特殊情况的一种select。 我需要的是一些方法来模拟以下内容:

 <TextBlock> <TextBlock.Text> Stuff on line1 <LineBreak/> Stuff on line2 </TextBlock.Text> <TextBlock/> 
 <TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/> 

您可以使用任何hex编码的值来表示文字。 在这种情况下,我使用了换行(char 10)。 如果你想做“经典” vbCrLf ,那么你可以使用&#x0d;&#x0a;

顺便说一句,请注意语法:它是&符号,英镑,字母x ,然后是所需字符的hex值,最后是分号。

另外:为了完整性,您可以绑定到一个已经embedded了行代码的文本,就像后面的代码中的一个常量,或者一个在运行时构build的variables。

也许你可以使用属性xml:space =“preserve”来保存源XAML中的空格

 <TextBlock xml:space="preserve"> Stuff on line 1 Stuff on line 2 </TextBlock> 

当你需要在一个string(例如:在你的资源)中执行它时,你需要使用xml:space="preserve" 和号字符代码:

 <System:String x:Key="TwoLiner" xml:space="preserve">First line&#10;Second line</System:String> 

或文字中的文字换行符:

 <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> 

警告:如果像第二个示例一样编写代码,则根据操作系统和/或文本编辑器使用的行尾插入了换行符,或者回车符和换行符。 举个例子,如果你把它写入并从git系统中提交,所有的东西都可能看起来很好 – 但是如果有人将它克隆到Windows,git会把你的行结尾转换为\r\n并且取决于你的string是什么你可能会打破世界

当你保留空格的时候要注意这一点。 如果你写这样的东西:

 <System:String x:Key="TwoLiner" xml:space="preserve"> First line Second line </System:String> 

实际上,您已经添加了四个换行符,可能有四个回车符,并且可能会隐藏不可见的尾随空白符…

你只需要删除<TextBlock.Text>并简单地添加你的内容如下:

  <Grid Margin="20"> <TextBlock TextWrapping="Wrap" TextAlignment="Justify" FontSize="17"> <Bold FontFamily="Segoe UI Light" FontSize="70">IR Iran</Bold><LineBreak/> <Span FontSize="35">I</Span>ran or Persia, officially the <Italic>Islamic Republic of Iran</Italic>, is a country in Western Asia. The country is bordered on the north by Armenia, Azerbaijan and Turkmenistan, with Kazakhstan and Russia to the north across the Caspian Sea.<LineBreak/> <Span FontSize="10">For more information about Iran see <Hyperlink NavigateUri="http://en.WikiPedia.org/wiki/Iran">WikiPedia</Hyperlink></Span> <LineBreak/> <LineBreak/> <Span FontSize="12"> <Span>Is this page helpful?</Span> <Button Content="No"/> <Button Content="Yes"/> </Span> </TextBlock> </Grid> 

在这里输入图像说明

请注意,要做到这一点,你需要在文本属性中做到这一点,你不能使用像内容

 <TextBlock>Stuff on line1&#x0a;Stuff on line 2</TextBlock> 

也许有人喜欢

 <TextBlock Text="{Binding StringFormat='Stuff on line1{0}Stuff on line2{0}Stuff on line3', Source={x:Static s:Environment.NewLine}}" /> 

xmlns:s="clr-namespace:System;assembly=mscorlib"

对于那些已经试过这个问题的每一个答案的人们,他们仍然摸不着头脑,为什么他们没有为你们工作,你可能遇到了我碰到的一个问题。

我的TextBlock.Text属性是一个ToolTipService.ToolTip元素的内部,它是从SQL存储过程中提取数据的对象的属性的数据绑定。 现在,存储过程中这个特定属性的数据正在从SQL函数中提取。

由于没有为我工作,我放弃了我的search,并创build了下面的转换器类:

 public class NewLineConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var s = string.Empty; if (value.IsNotNull()) { s = value.ToString(); if (s.Contains("\\r\\n")) s = s.Replace("\\r\\n", Environment.NewLine); if (s.Contains("\\n")) s = s.Replace("\\n", Environment.NewLine); if (s.Contains("&#x0a;&#x0d;")) s = s.Replace("&#x0a;&#x0d;", Environment.NewLine); if (s.Contains("&#x0a;")) s = s.Replace("&#x0a;", Environment.NewLine); if (s.Contains("&#x0d;")) s = s.Replace("&#x0d;", Environment.NewLine); if (s.Contains("&#10;&#13;")) s = s.Replace("&#10;&#13;", Environment.NewLine); if (s.Contains("&#10;")) s = s.Replace("&#10;", Environment.NewLine); if (s.Contains("&#13;")) s = s.Replace("&#13;", Environment.NewLine); if (s.Contains("<br />")) s = s.Replace("<br />", Environment.NewLine); if (s.Contains("<LineBreak />")) s = s.Replace("<LineBreak />", Environment.NewLine); } return s; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 

我最终不得不使用@ dparker的答案 Enivornment.NewLine方法。 我指示转换器查找换行符的任何可能的文本表示,并用Environment.NewLinereplace它。

这工作!

然而,我仍然困惑为什么其他方法没有与数据绑定属性。

我留下了@ BobKing接受的答案的评论:

@BobKing – 当绑定到具有从SQL sprocembedded的行提要的字段时,似乎在ToolTipService.ToolTip中不起作用。

他回答说:

@CodeMaverick如果你使用embedded的新行绑定到文本,它们应该是真正的十进制值(或13),而不是XML哨兵。 这只有在你想在XAML文件中写入新的文字行的情况下。

一个灯泡熄灭!

我进入了我的SQL函数,用新的行代替了换行符的文本表示。

 CHAR( 13 ) + CHAR( 10 ) 

…从我的TextBlock.Text绑定中删除转换器,就像这样… 它的工作!

我发现这很有帮助,但在将它添加到XAML中的“Content = …”标记时遇到了一些错误。

我在内容中有多行,后来发现内容保留了空格,即使我没有指定。 所以为了解决这个问题,让它“忽略”空白,我实现了这个。

 <ToolTip Width="200" Style="{StaticResource ToolTip}" Content="'Text Line 1' &#x0a;&#x0d;'Text Line 2' &#x0a;&#x0d;'Text Line 3'"/> 

希望这可以帮助别人。

(输出有三行文字,每行之间有空行)

我意识到这是在较老的问题,但只是想补充一点

Environment.NewLine

如果通过代码来实现这个功

也不工作

 <TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text> 

没什么大不了的,只需要使用

 <TextBlock Text="Cool &#x0a;Newline trick" /> 

代替。

 <TextBox Name="myTextBox" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Visible" />