繁体   English   中英

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

[英]Why is my WPF ListView column not right aligning?

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

这里有几个并发症。
如果运行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"

右对齐 ListView GridViewColumn 中的文本:

  1. 设置 ListViewItem.HorizontalContentAlignment="Stretch" 以便列单元格继承它
  2. 为要与 TextBlock 右对齐的列设置一个 CellTemplate,其 HorizontalAlignment="Right"
  3. 不能在列上使用 DataMemberBinding,否则 CellTemplate 将被忽略

例如:

<ListView Name="_priceListListView" ItemsSource="{Binding PriceList}" >

  <!-- How to set ListViewItem.HorizontalContentAlignment="Stretch" -->
  <ListView.Resources>
    <Style TargetType="ListViewItem">
      <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    </Style>
  </ListView.Resources>

  <ListView.View>
    <GridView>
      <GridView.Columns>

        <!-- Left-aligned text column -->
        <GridViewColumn Header="Item" DisplayMemberBinding="{Binding Path=Item}" />

        <!-- Right-aligned numeric column -->
        <GridViewColumn Header="Price" >
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <TextBlock Text="{Binding Price, StringFormat={}{0:C}}" HorizontalAlignment="Right" />
            </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>

      </GridView.Columns>
    </GridView>
  </ListView.View>
</ListView>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM