我在列表框中对齐字符串内容时遇到问题。下面是一个经过提炼的示例,演示了我的应用遇到的问题:
基本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的建议中,那也会起作用,因为这是最终的目标。
2条答案
按热度按时间8aqjt8rx1#
问题是由控件使用的字体引起的。它是一种比例字体,因此您无法使用空格来填充特定宽度的列,因为每行的文本部分的像素长度都不同。
设置一个固定宽度的字体,如Consolas(其中每个字符的像素宽度相同)将解决这个问题。
然而,固定宽度的字体看起来不是很令人愉快,更好的解决方案是使用一个“知道”“多列”意味着什么的控件。
wydwbb8l2#
对于那些想用比例字体显示
string.Format
的人,可以试试这个XAML(这只是 * 为了好玩 *,但可能会在一些简单的应用程序中使用,这些应用程序在样式上不需要太多的灵活性)。使用这个代码,我们可能需要根据所选的字体调整固定的Width
:字符串
这里的想法是每个字符串都是一个字符数组。(字符串)。模板应该是
ItemsControl
,以显示自定义ItemsPanelTemplate
中的字符列表,从而水平堆叠这些字符(加入可读的文本)。因为每个字符都是具有固定宽度的Border
,它可以与任何字体一起使用,并为Border
(及其Margin
)设置适当的宽度。对于 Package 文本,我们可能需要使用WrapPanel
。但无论如何,这是某种有趣的技巧,不应该在重要的商业应用程序中使用。的数据