如何摆脱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
选项“保留属性之间的新行和空格”,则不会通过自动重新格式化来更改此格式:
我写了一个附加属性来绕过这个行为。
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中的这些空格。