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
Stuff on line 2"/>
您可以使用任何hex编码的值来表示文字。 在这种情况下,我使用了换行(char 10)。 如果你想做“经典” vbCrLf
,那么你可以使用

顺便说一句,请注意语法:它是&符号,英镑,字母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 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
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("

")) s = s.Replace("

", Environment.NewLine); if (s.Contains("
")) s = s.Replace("
", Environment.NewLine); if (s.Contains("
")) s = s.Replace("
", Environment.NewLine); if (s.Contains(" ")) s = s.Replace(" ", Environment.NewLine); if (s.Contains(" ")) s = s.Replace(" ", Environment.NewLine); if (s.Contains(" ")) s = s.Replace(" ", 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.NewLine
replace它。
这工作!
然而,我仍然困惑为什么其他方法没有与数据绑定属性。
我留下了@ 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' 

'Text Line 2' 

'Text Line 3'"/>
希望这可以帮助别人。
(输出有三行文字,每行之间有空行)
我意识到这是在较老的问题,但只是想补充一点
Environment.NewLine
如果通过代码来实现这个功
也不工作
<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>
没什么大不了的,只需要使用
<TextBlock Text="Cool 
Newline trick" />
代替。
<TextBox Name="myTextBox" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Visible" />
- 如何添加垂直分隔符?
- WPF TreeView:如何使用类似于资源pipe理器中的圆angular来select项目的样式
- 如何使WPF DataGrid单元格右alignment,而不使新行上的可选区域变得很小?
- 在WPFvalidation中ValidatesOnNotifyDataErrors和ValidatesOnDataErrors和NotifyOnValidationError有什么区别?
- 如何获得屏幕的分辨率? 对于WinRT应用程序?
- 绑定到转换器参数
- 绑定collections到StackPanel
- 跨多个Xaml文件分割WPF界面
- 这种types的CollectionView不支持从与分派器线程不同的线程对其SourceCollection的更改