Почему мой столбец WPF ListView неправильно выровнен? - PullRequest
0 голосов
/ 29 апреля 2018

В моем представлении 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 Как: изменить горизонтальное выравнивание столбца в ListView , что здесь может быть не так?

1 Ответ

0 голосов
/ 29 апреля 2018

Здесь есть несколько осложнений.
Если вы запустите 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"
...