问题是由您的控件使用的字体引起的。它是一种比例字体,因此您无法使用空格来填充列来创建特定宽度的列,因为每行文本部分的像素长度都不同。
设置像 Consolas 这样的固定宽度字体(其中每个字符具有相同的像素宽度)将解决该问题。
但是,固定宽度字体看起来不太舒服,更好的解决方案是使用“知道”“多列”含义的控件。 (列表视图、数据网格)
对于那些想要使用比例字体显示
string.Format
的人,请尝试此 XAML(这只是 为了好玩,但可以在一些不需要太多样式灵活性的简单应用程序中使用)。使用此代码,我们可能需要根据所选字体调整固定的 Width
:
<ListBox x:Name="lstClients" HorizontalAlignment="Left" Height="220" Margin="28,22,0,0"
VerticalAlignment="Top" Width="625" FontFamily="Lucida Calligraphy">
<ListBox.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Width="20" Margin="0,0,-12,0">
<TextBlock Text="{Binding}" TextAlignment="Center"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这里的想法是每个字符串都是一个字符数组。因此,我们为每个数据项(字符串)定义一个
ItemTemplate
。模板应该是一个 ItemsControl
,以在自定义 ItemsPanelTemplate
中显示字符列表,以水平堆叠这些字符(以加入可读文本)。因为每个字符都是具有固定宽度的 Border
,所以它可以与为 Border
(及其 Margin
)设置适当宽度的任何字体一起使用。为了换行文本,我们可能需要使用 WrapPanel
来代替。但无论如何,这是某种有趣的技巧,不应该在重要的商业应用程序中使用。