【问题标题】:Why is my WPF ListView column not right aligning?为什么我的 WPF ListView 列不正确对齐?
【发布时间】:2026-02-10 00:40:01
【问题描述】:

在显示文件列表的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 中的示例进行操作,那么这里可能有什么问题?

【问题讨论】:

    标签: wpf xaml listview alignment text-alignment


    【解决方案1】:

    这里有几个复杂的问题。
    如果您运行 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"
    

    【讨论】:

    • 我已经有了你在 1) 和 2) 中的建议,但它不起作用。所以如果有时间我想我会去探索源代码。如果没有时间,将字符串格式的大小 (FileSizeConverter) 左对齐并不太严重。它仍然比一长串数字更具可读性。
    • 再看一遍。文本对齐不在您的标记中,而我的绝对有效。
    最近更新 更多