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

问题描述 投票:0回答:2

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

到目前为止,我得到的最好的代码是这段代码,但所有内容都是左对齐的(我已经放入右对齐来测试代码)。有人可以告诉我哪里出错了吗?

<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>
wpf listview
2个回答
58
投票

默认情况下,您的

ListViewItem
不会拉伸内容,这就是所有项目都显示在左侧的原因。添加这个就可以了:

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

14
投票

虽然 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 的提示帮助我一样。

© www.soinside.com 2019 - 2024. All rights reserved.