如何摆脱TextBlock中运行之间的空白?

我有以下XAML:

<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10" FontFamily="Arial" Foreground="#414141"> <Run Text="{Binding LoadsCount}" /> <Run Text="+" /> <Run Text="{Binding BrokerLoadsCount}" /> </TextBlock> 

我得到这样的显示: 12 + 11不知怎的,它在每次Run之间插入额外的空间如何让它显示12+11

运行标签之间的空格导致空格,这是最简单的修复。

 <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10" FontFamily="Arial" Foreground="#414141"> <Run Text="{Binding LoadsCount}" /><Run Text="+" /><Run Text="{Binding BrokerLoadsCount}" /> </TextBlock> 

因为<TextBlock></TextBlock>之间的任何内容都是以</TextBlock>的text属性为目标的,所以在运行之间的间隔中的空格会导致您看到的效果。 你也可以缩短到这个。

 <Run Text="{Binding LoadsCount}" />+<Run Text="{Binding BrokerLoadsCount}" /> 

这篇MSDN文章给出了关于xaml如何处理空白的所有细节

http://msdn.microsoft.com/en-us/library/ms788746.aspx

如果你很好奇为什么rest和一大堆标签翻译成一个空间

所有空格字符(空格,换行符,制表符)都被转换为空格。

所有连续的空格都被删除并被一个空格replace

Kevin的一个很好的解决scheme的一个问题是,当您应用一些XAML / XML自动重新格式化函数(例如“ctrl-K + ctrl-D”)时, XAML标记的单行格式化被取消。 我发现一个解决方法是格式化Run标记,如下所示:

 <TextBlock> <Run FontStyle="Italic" Text="aaa" /><Run Text="bbb" /> </TextBlock> 

尽pipe像这样跨线拆分标签有些尴尬,但是如果您为XAML文本编辑器select了Visual Studio选项“保留属性之间的新行和空格”,则不会通过自动重新格式化来更改此格式:

XAML中的连续运行元素之间消除了额外的空间

我写了一个附加属性来绕过这个行为。

 public class TextBlockExtension { public static bool GetRemoveEmptyRuns(DependencyObject obj) { return (bool)obj.GetValue(RemoveEmptyRunsProperty); } public static void SetRemoveEmptyRuns(DependencyObject obj, bool value) { obj.SetValue(RemoveEmptyRunsProperty, value); if (value) { var tb = obj as TextBlock; if (tb != null) { tb.Loaded += Tb_Loaded; } else { throw new NotSupportedException(); } } } public static readonly DependencyProperty RemoveEmptyRunsProperty = DependencyProperty.RegisterAttached("RemoveEmptyRuns", typeof(bool), typeof(TextBlock), new PropertyMetadata(false)); public static bool GetPreserveSpace(DependencyObject obj) { return (bool)obj.GetValue(PreserveSpaceProperty); } public static void SetPreserveSpace(DependencyObject obj, bool value) { obj.SetValue(PreserveSpaceProperty, value); } public static readonly DependencyProperty PreserveSpaceProperty = DependencyProperty.RegisterAttached("PreserveSpace", typeof(bool), typeof(Run), new PropertyMetadata(false)); private static void Tb_Loaded(object sender, RoutedEventArgs e) { var tb = sender as TextBlock; tb.Loaded -= Tb_Loaded; var spaces = tb.Inlines.Where(a => a is Run && string.IsNullOrWhiteSpace(((Run)a).Text) && !GetPreserveSpace(a)).ToList(); spaces.ForEach(s => tb.Inlines.Remove(s)); } } 

整个源代码和解释都可以在这里find。 通过使用这个附加的属性,你可以保持你的XAML格式只是你想要的方式,但是你没有得到你的渲染XAML中的这些空格。