如何在WPF中自动调整和右对齐GridViewColumn数据?

Edw*_*uay 82 wpf xaml listview gridview gridviewcolumn

我怎么能够:

  • 右对齐ID列中的文本
  • 根据具有最长可见数据的单元格的文本长度使每个列自动调整大小?

这是代码:

<ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="40"/>
            <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="100" />
            <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}"/>
        </GridView>
    </ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)

部分答案:

感谢Kjetil,GridViewColumn.CellTemplate运行良好,自动宽度当然有效但是当使用长于列宽的数据更新ObservativeCollection"Collection"时,列大小不会自行更新,因此这只是一个解决方案.初始显示数据:

<ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID" Width="Auto">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Id}" TextAlignment="Right" Width="40"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="Auto" />
            <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" Width="Auto"/>
        </GridView>
    </ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)

Kje*_*dal 97

要使每个列自动调整大小,可以在GridViewColumn上设置Width ="Auto".

要右对齐ID列中的文本,可以使用TextBlock创建单元格模板并设置TextAlignment.然后设置ListViewItem.Horizo​​ntalContentAlignment(使用ListViewItem上带有setter的样式)使单元格模板填充整个GridViewCell.

也许有一个更简单的解决方案,但这应该有效.

注意:该解决方案在CellTemplate中需要在Window.Resources中使用Horizo​​ntalContentAlignment = Stretch,在TextTemplate中使用TextAlignment = Right.

<Window x:Class="WpfApplication6.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    </Style>
</Window.Resources>
<Grid>
    <ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" Width="40">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Id}" TextAlignment="Right" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="Auto" />
                <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" Width="Auto"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

  • +1 for:<Setter Property ="Horizo​​ntalContentAlignment"Value ="Stretch"/> (13认同)
  • 如果您忘记从GridViewColumn中删除DisplayMemberBinding,它也不起作用.那么模板就没有任何效果了. (7认同)

Ran*_*ngy 35

如果内容的宽度发生变化,您将不得不使用这段代码来更新每一列:

private void ResizeGridViewColumn(GridViewColumn column)
{
    if (double.IsNaN(column.Width))
    {
        column.Width = column.ActualWidth;
    }

    column.Width = double.NaN;
}
Run Code Online (Sandbox Code Playgroud)

每次该列的数据更新时,您都必须触发它.


Rol*_*els 18

如果列表视图也在重新调整大小,那么您可以使用行为模式重新调整列的大小以适应完整的ListView宽度.与使用grid.column定义几乎相同

<ListView HorizontalAlignment="Stretch"
          Behaviours:GridViewColumnResize.Enabled="True">
        <ListViewItem></ListViewItem>
        <ListView.View>
            <GridView>
                <GridViewColumn  Header="Column *"
                                   Behaviours:GridViewColumnResize.Width="*" >
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox HorizontalAlignment="Stretch" Text="Example1" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
Run Code Online (Sandbox Code Playgroud)

有关示例,请参阅以下链接并链接到源代码 http://lazycowprojects.tumblr.com/post/7063214400/wpf-c-listview-column-width-auto


小智 10

我创建了以下类,并在需要的地方使用了所有应用程序代替GridView:

/// <summary>
/// Represents a view mode that displays data items in columns for a System.Windows.Controls.ListView control with auto sized columns based on the column content     
/// </summary>
public class AutoSizedGridView : GridView
{        
    protected override void PrepareItem(ListViewItem item)
    {
        foreach (GridViewColumn column in Columns)
        {
            // Setting NaN for the column width automatically determines the required
            // width enough to hold the content completely.

            // If the width is NaN, first set it to ActualWidth temporarily.
            if (double.IsNaN(column.Width))
              column.Width = column.ActualWidth;

            // Finally, set the column with to NaN. This raises the property change
            // event and re computes the width.
            column.Width = double.NaN;              
        }            
        base.PrepareItem(item);
    }
}
Run Code Online (Sandbox Code Playgroud)


pap*_*zzo 7

由于我有一个ItemContainerStyle,我必须将Horizo​​ntalContentAlignment放在ItemContainerStyle中

    <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=FieldDef.DispDetail, Mode=OneWay}" Value="False">
                         <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
                <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
    ....
Run Code Online (Sandbox Code Playgroud)


小智 5

我喜欢user1333423的解决方案,除了它总是重新调整每列的大小; 我需要允许一些列固定宽度.因此,在此版本中,宽度设置为"自动"的列将自动调整大小,设置为固定量的列将不会自动调整大小.

public class AutoSizedGridView : GridView
{
    HashSet<int> _autoWidthColumns;

    protected override void PrepareItem(ListViewItem item)
    {
        if (_autoWidthColumns == null)
        {
            _autoWidthColumns = new HashSet<int>();

            foreach (var column in Columns)
            {
                if(double.IsNaN(column.Width))
                    _autoWidthColumns.Add(column.GetHashCode());
            }                
        }

        foreach (GridViewColumn column in Columns)
        {
            if (_autoWidthColumns.Contains(column.GetHashCode()))
            {
                if (double.IsNaN(column.Width))
                    column.Width = column.ActualWidth;

                column.Width = double.NaN;                    
            }          
        }

        base.PrepareItem(item);
    }        
}
Run Code Online (Sandbox Code Playgroud)