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

rks48beu  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(109)

我在列表框中对齐字符串内容时遇到问题。下面是一个经过提炼的示例,演示了我的应用遇到的问题:
基本XAML UI:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="687" Loaded="Window_Loaded">
    <Grid>
        <ListBox x:Name="lstClients" HorizontalAlignment="Left" Height="220" Margin="28,22,0,0" VerticalAlignment="Top" Width="625"/>
    </Grid>
</Window>

字符串
验证码:

Class MainWindow
    Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
        Dim names() As String = {"Cook, Adam", "Renolds, Bridgette", "Smith, Carla", "Doe, Daniel",
                                "Redmond, Ebenezer", "Kelly, Francine"}
        Dim ids() As String = {"123456", "654321", "112345", "274587", "128493", "937401"}
        Dim dob() As String = {"1/2/80", "4/17/88", "8/31/72", "6/11/91", "10/27/81", "3/3/75"}
        Dim phones() As String = {"1234567890", "2536772364", "1537779004", "7586712164", "8548778384", "0987654321"}

        For i As Integer = 0 To 5
            lstClients.Items.Add(FormatClientString(names(i), ids(i), dob(i), phones(i)))
        Next
    End Sub

    Private Function FormatClientString(name As String, id As String, birthDate As String, phone As String)
        Dim clientString As String
        clientString = String.Format("{0, -52} {1, -17} {2, -20} {3}", name, id, birthDate, phone)
        Return clientString
    End Function
End Class


输出:

这是我实际上试图完成的(蹩脚的绘画编辑,但基本上我只是希望列对齐,不管客户端名称的长度):

从我所读到的,String.Format应该做我想做的,但输出永远是正确的。我也尝试使用String.PadRight为每个字符串(名称,id,dob和电话),但得到了相同的行为(未对齐的列)。
我是不是忽略了一些简单的东西?

编辑:我的实际应用程序中的控件不是ListBox。它是来自WPF Toolkit的AutoCompleteBox。我使用上面的ListBox作为示例,因为它表现出相同的行为格式化字符串,并且更容易制作简单的示例。

如果有人知道如何将列添加到AutoCompleteBox的建议中,那也会起作用,因为这是最终的目标。

8aqjt8rx

8aqjt8rx1#

问题是由控件使用的字体引起的。它是一种比例字体,因此您无法使用空格来填充特定宽度的列,因为每行的文本部分的像素长度都不同。
设置一个固定宽度的字体,如Consolas(其中每个字符的像素宽度相同)将解决这个问题。
然而,固定宽度的字体看起来不是很令人愉快,更好的解决方案是使用一个“知道”“多列”意味着什么的控件。

wydwbb8l

wydwbb8l2#

对于那些想用比例字体显示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>

字符串
这里的想法是每个字符串都是一个字符数组。(字符串)。模板应该是ItemsControl,以显示自定义ItemsPanelTemplate中的字符列表,从而水平堆叠这些字符(加入可读的文本)。因为每个字符都是具有固定宽度的Border,它可以与任何字体一起使用,并为Border(及其Margin)设置适当的宽度。对于 Package 文本,我们可能需要使用WrapPanel。但无论如何,这是某种有趣的技巧,不应该在重要的商业应用程序中使用。


的数据

相关问题