如何对齐列表框中的字符串内容文本?

问题描述 投票:0回答:2
wpf vb.net string-formatting
2个回答
2
投票

问题是由您的控件使用的字体引起的。它是一种比例字体,因此您无法使用空格来填充列来创建特定宽度的列,因为每行文本部分的像素长度都不同。

设置像 Consolas 这样的固定宽度字体(其中每个字符具有相同的像素宽度)将解决该问题。

但是,固定宽度字体看起来不太舒服,更好的解决方案是使用“知道”“多列”含义的控件。 (列表视图、数据网格)


1
投票

对于那些想要使用比例字体显示

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
来代替。但无论如何,这是某种有趣的技巧,不应该在重要的商业应用程序中使用。

© www.soinside.com 2019 - 2024. All rights reserved.