2015-10-22 91 views
0

我在對齊列表框中的字符串內容時遇到問題。以下是一個演示我的應用程序有問題蒸餾例如:如何對齊列表框中的字符串內容文本?

基本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 

輸出: output

這裏是什麼我實際上正在努力完成(糟糕的繪畫編輯,但基本上我只是希望列對齊,無論長度如何e客戶的名字): desiredOutput

從我讀到的,String.Format應該做我想做的,但輸出是永遠不對。我還嘗試使用String.PadRight爲每個字符串(名稱,ids,dob和電話),但得到相同的行爲(未對齊的列)。

我可以忽略一些簡單的東西嗎?

編輯:我的實際應用程序中的控件不是ListBox。它是一個來自WPF Toolkit的自動完成框。我使用上面的ListBox作爲示例,因爲它展示了格式化字符串的相同行爲,並且更容易做出一個簡單的示例。

如果有人知道如何將列添加到AutoCompleteBox的下拉建議中,那也可以工作,因爲這最終是目標。

+1

比例寬度字體的每個字母和空格都沒有相同的寬度。但是,爲什麼不使用ListView呢? – Steve

+0

@Steve實際上它是一個來自[WPF Toolkit](http://wpf.codeplex.com/releases/view/40535)的自動完成框,但錯誤對齊行爲在ListBox中是相同的(我正在使用'List(Of String)'爲AutoCompleteBox的'ItemsSource')。 –

+1

正如我所說。問題是由您的控件使用的字體引起的。它是一種比例字體,因此您無法使用空格創建特定寬度的列以填充缺失的字符。嘗試設置一個固定寬度的字體,如Consolas,你會看到不同之處。簡單的解決方案是使用一個'知道''多列'意味着什麼的控件。 – Steve

回答

1

問題是由控件使用的字體引起的。它是一種比例字體,因此您無法使用空格填充列來創建特定寬度的列,因爲每行的文本部分的像素長度都不相同。

設置像Consolas這樣的固定寬度的字體(每個字符都有相同的像素寬度)將解決這個問題。

然而,固定寬度的字體並不是很令人愉快的看法,更好的解決方案是使用一個'知道''多列'意味着什麼的控件。 (ListView控件,數據網格)

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 foreach數據項(一個字符串)。該模板應該是ItemsControl,以顯示自定義ItemsPanelTemplate中的字符列表,以便水平堆疊這些字符(以可讀文本形式加入)。由於每個字符都是固定寬度的Border,因此可以使用任何適合於寬度設置爲Border(及其Margin)的字體。爲了包裝文字,我們可能需要改用WrapPanel。但無論如何,這是一種有趣的技巧,不應該用於重要的商業應用程序。

enter image description here