为列表视图列设置不同的对齐方式

21

我在绘制一个带有左对齐或居中对齐列的列表视图时遇到了问题。我查看了一些在此处或其他论坛上找到的解决方案,但它们似乎要么适用于所有列,要么我无法使它们工作。

到目前为止,我最好的代码是这样的,但所有内容都是左对齐的(我已经添加了右对齐以测试代码)。请问有人能告诉我哪里出了问题吗?

<ListView Name="lsvQuestions" DockPanel.Dock="Bottom">                
     <ListView.View>
         <GridView>
             <GridViewColumn Width="450" Header="Question Text">
                 <GridViewColumn.CellTemplate>
                     <DataTemplate>
                         <TextBlock Text="{Binding QuestionText}" TextAlignment="Left"/>
                     </DataTemplate>
                 </GridViewColumn.CellTemplate>
                 </GridViewColumn>
                 <GridViewColumn Width="200" Header="Type">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding QuestionType}" TextAlignment="Right"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                 </GridViewColumn>
                 <GridViewColumn Width="100" Header="Page Number">
                     <GridViewColumn.CellTemplate>
                         <DataTemplate>
                             <TextBlock Text="{Binding QuestionPageNumber}" TextAlignment="Center"/>
                         </DataTemplate>
                     </GridViewColumn.CellTemplate>
                 </GridViewColumn>
                 <GridViewColumn Width="100" Header="Order">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding QuestionOrder}" TextAlignment="Center"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>               
    </ListView>
2个回答

57

默认情况下,ListViewItem 不会自动拉伸其内容,这就是为什么所有项都出现在左侧的原因。添加以下代码即可解决:

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

13
尽管LPL的提示已经帮助我们避免了很多麻烦,但我会更进一步,将HorizontalContentAlignmentVerticalContentAlignment定义为stretch,以便在大多数使用表格驱动控件时定位预期的对齐行为:
  • ListView列标题和项模板

  • DataGrid列标题和单元格模板。

<Window x:Class="TaskManager.UI.Views.AcumuladosPorTarefaWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:v="clr-namespace:TaskManager.UI.Views"
xmlns:catel="http://catel.codeplex.com"        
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="AcumuladosPorTarefaWindow" Height="451.533" Width="323.305"
>
<Window.Resources>
<Style TargetType="GridViewColumnHeader">
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />
</Style>
<Style TargetType="DataGridColumnHeader">
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />
</Style>
<Style TargetType="ListViewItem">
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />
</Style>
<Style TargetType="DataGridCell">
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />
</Style>
</Window.Resources>
<StackPanel Orientation="Vertical">

<ListView ItemsSource="{Binding AcumuladosPorTarefa}" SelectedItem="{Binding LinhaSelecionada}">
    <ListView.View>
        <GridView>
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding TarefaID}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
                <GridViewColumnHeader>
                    <TextBlock Text="ID" TextAlignment="Center" />
                </GridViewColumnHeader>
            </GridViewColumn>
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Tarefa.Nome}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
                <TextBlock Text="Nome" TextAlignment="Left"/>
            </GridViewColumn>
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding DuracaoInMS}" TextAlignment="Right" HorizontalAlignment="Stretch" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
                <GridViewColumnHeader Width="auto">
                    <TextBlock Text="Duração" TextAlignment="Right"/>
                </GridViewColumnHeader>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>
<DataGrid ItemsSource="{Binding AcumuladosPorTarefa}" AutoGenerateColumns="False" SelectedItem="{Binding LinhaSelecionada}" CanUserAddRows="False" HorizontalAlignment="Stretch">
    <DataGrid.Columns>
        <DataGridTemplateColumn Width="auto" MinWidth="20" CanUserSort="True" CanUserReorder="True" CanUserResize="True">
            <DataGridTemplateColumn.Header>
                <TextBlock Text="ID" TextAlignment="Right" />
            </DataGridTemplateColumn.Header>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding TarefaID}" HorizontalAlignment="Stretch"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Width="auto" MinWidth="150" CanUserSort="True">
            <DataGridTemplateColumn.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Text="Nome" HorizontalAlignment="Left"/>
                </DataTemplate>
            </DataGridTemplateColumn.HeaderTemplate>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Tarefa.Nome}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Duração" Width="auto" MinWidth="25" IsReadOnly="True">
            <DataGridTemplateColumn.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Text="Duração" TextAlignment="Right"/>
                </DataTemplate>
            </DataGridTemplateColumn.HeaderTemplate>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding DuracaoInMS}" TextAlignment="Right" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
</StackPanel>
</Window>

记住:您可以始终在应用程序级别定义默认样式和其他资源,因此您不必在每个视图中定义它。

希望这能像LPL的提示一样帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接