如何格式化ListBox中动态添加项目的文本?

时间:2014-08-24 21:42:31

标签: wpf string format textblock listboxitem

我需要格式化每个文本块中的文本,这是我的ListBox的一个项目。我设法制作了一些东西,但它看起来不像我调用Console.WriteLine-Method。

private void addNewGameItem(string gamename, string lastChangedDate)
    {
        ListBoxItem lbi = new ListBoxItem();
        StackPanel stpl = new StackPanel();
        TextBlock tbl = new TextBlock();

        tbl.Text = String.Format("{0,-100} {1,30}", gamename, lastChangedDate);
        tbl.FontSize = textBlockFontsize;

        stpl.Orientation = Orientation.Horizontal;
        stpl.Children.Add(tbl);
        lbi.Content = stpl;
        savedGamesList.Items.Add(lbi);//Add the ListBoxItem to the ListBox
    }

问题在于,如果游戏名称比例如前一个更长,则日期将更加正确。我如何格式化这个,不管游戏名称有多长,所以日期字符串将从每个文本块中的相同位置开始?

1 个答案:

答案 0 :(得分:1)

这在XAML中可能更容易完成,而不是后面的代码,因为您可以更轻松地定义用于以这种方式显示列表项的DataTemplate。将您的游戏列表设为ObservableCollection,并将列表框的ItemsSource绑定到该列表。这意味着当您向列表中添加新项目时它会自动更新。

然后你可以将字符串分成两部分,一部分用于游戏名称,另一部分用于日期:

<ListBoxItem ...>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding GameName"}/>
            <TextBlock Text="{Binding LastChangedDate"}
                       HorizontalAlignment="Right"/>
        </StackPanel>
    </DataTemplate>
</ListBoxItem>

然后在ListBox样式定义中包含以下行:

HorizontalContentAlignment="Stretch"

这将使每个列表框项目填充列表框的整个宽度,并且(只要格式化日期以使它们都具有相同的长度)正确对齐它们。