我关注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
?
答案 0 :(得分:116)
运行标记之间的空格会导致空格,这是最简单的修复方法。
<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
如果你很好奇为什么休息和大量标签会转换为单个空格
将所有空白字符(空格,换行符,制表符)转换为 空格。
删除所有连续的空格并替换为一个空格
答案 1 :(得分:17)
另一种选择是在Run标签之间注释空格,保持代码可读并删除额外的空间。
<TextBlock HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="10" FontFamily="Arial" Foreground="#414141">
<Run Text="{Binding LoadsCount}" /><!--
--><Run Text="+" /><!--
--><Run Text="{Binding BrokerLoadsCount}" />
</TextBlock>
答案 2 :(得分:15)
Kevin的一个很好的解决方案的一个问题是,当您应用某些XAML / XML自动重新格式化功能时,XAML
标记的单行格式化将被撤消,例如: &#34; ctrl-K + ctrl-D&#34;。我找到的一种解决方法是格式化Run
标记,如下所示:
<TextBlock>
<Run FontStyle="Italic"
Text="aaa" /><Run
Text="bbb" />
</TextBlock>
尽管在这样的行之间拆分标签有点尴尬,但如果您选择Visual Studio
选项&#34;保留属性和#34之间的新行和空格,则自动重新格式化不会更改此格式。对于XAML文本编辑器:
答案 3 :(得分:1)
我已经写了一个附加财产以绕过&#39;这种行为。
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));
}
}
可以找到整个源代码及其全部解释here。 通过使用此附加属性,您可以按照自己的方式保持XAML格式,但是在渲染的XAML中不会获得这些空格。
答案 4 :(得分:1)
我的解决方案是使默认字体大小几乎不可见(FontSize="1"
),然后将每个<Run
的字体大小设置为所需的大小:
<TextBlock HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="1"
FontFamily="Arial"
Foreground="#414141">
<Run FontSize="10" Text="{Binding LoadsCount}" />
<Run FontSize="10" Text="+" />
<Run FontSize="10" Text="{Binding BrokerLoadsCount}" />
</TextBlock>
您最好在“隐藏代码”中进行此操作。我已经尝试过以前的解决方案,但是在某些情况下VS只是格式化了仔细缩进的代码。
答案 5 :(得分:0)
我将Pieter的附加属性移植到WPF(我认为这是用于UWP)。
示例:
<StackPanel>
<TextBlock Text="Before:" FontWeight="SemiBold"/>
<TextBlock>
Foo
<Run Text="Bar"/>
<Run>Baz</Run>
</TextBlock>
<TextBlock Text="After:" FontWeight="SemiBold" Margin="0,10,0,0"/>
<TextBlock local:TextBlockHelper.TrimRuns="True">
Foo
<Run Text="Bar"/>
<Run>Baz</Run>
</TextBlock>
<TextBlock Text="Use two spaces if you want one:" FontWeight="SemiBold" Margin="0,10,0,0"/>
<TextBlock local:TextBlockHelper.TrimRuns="True">
Foo
<Run Text=" Bar"/>
<Run>Baz</Run>
</TextBlock>
</StackPanel>
using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
public class TextBlockHelper
{
public static bool GetTrimRuns(TextBlock textBlock) => (bool)textBlock.GetValue(TrimRunsProperty);
public static void SetTrimRuns(TextBlock textBlock, bool value) => textBlock.SetValue(TrimRunsProperty, value);
public static readonly DependencyProperty TrimRunsProperty =
DependencyProperty.RegisterAttached("TrimRuns", typeof(bool), typeof(TextBlockHelper),
new PropertyMetadata(false, OnTrimRunsChanged));
private static void OnTrimRunsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var textBlock = d as TextBlock;
textBlock.Loaded += OnTextBlockLoaded;
}
static void OnTextBlockLoaded(object sender, EventArgs args)
{
var textBlock = sender as TextBlock;
textBlock.Loaded -= OnTextBlockLoaded;
var runs = textBlock.Inlines.OfType<Run>().ToList();
foreach (var run in runs)
run.Text = TrimOne(run.Text);
}
private static string TrimOne(string text)
{
if (text.FirstOrDefault() == ' ')
text = text.Substring(1);
if (text.LastOrDefault() == ' ')
text = text.Substring(0, text.Length - 1);
return text;
}
}