为什么我的WPF ListView列没有正确对齐?

时间:2018-04-29 05:03:52

标签: wpf xaml listview alignment text-alignment

在显示文件列表的Explorer视图中,我尝试右对齐Size列,如下所示。我有以下资源:

<UserControl.Resources>
    <converters:FileSizeConverter x:Key="FileSizeConverter" />
    <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    </Style>
    <DataTemplate x:Key="SizeTemplate">
        <TextBlock HorizontalAlignment="Right" Text="{Binding Size, Converter={StaticResource FileSizeConverter}}" />
    </DataTemplate>
</UserControl.Resources>

FileSizeConverter只是一个IValueConverter,它将数字文件大小转换为包含B,KB,MB等的字符串格式。然后,我有以下列:

<GridViewColumn CellTemplate="{StaticResource SizeTemplate}" Header="Size" Width="80" />

这会显示正确转换的文件大小,例如8,2 KB,但仍然保持左对齐。我已经按照Microsoft Docs文章How to: Change the Horizontal Alignment of a Column in a ListView中的示例进行了操作,那么这里可能出现什么问题?

1 个答案:

答案 0 :(得分:0)

这里有几个复杂因素 如果你运行Snoop并查看你在视图中最终得到的内容,你会发现文本块是在gridviewrowpresenter中托管的。
这是应用一堆代码来列出它的内容 如果你真的想知道它是如何工作的,那么你可以在这里选择源代码https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/GridViewRowPresenter.cs

如果您对如何按需工作更感兴趣,那么有两件事要做:

1)使列伸展:

<ListView.Resources>
      <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    </Style>
</ListView.Resources>

2)将文本块放在可填充该空间的容器中,并允许文本块对齐。或者,更简单。在文本块上设置TextAlignment。

<DataTemplate x:Key="SizeTemplate">
    <TextBlock TextAlignment="Right"