90

どうやって:

  • 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>

部分的な答え:

Kjetil に感謝します。GridViewColumn.CellTemplate はうまく機能し、自動幅はもちろん機能しますが、ObservativeCollection の「コレクション」が列幅よりも長いデータで更新されると、列のサイズは更新されないため、これは唯一の解決策です。データの初期表示:

<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>
4

13 に答える 13

106

各列を自動サイズにするには、GridViewColumn で Width="Auto" を設定します。

ID 列のテキストを右揃えにするには、TextBlock を使用してセル テンプレートを作成し、TextAlignment を設定します。次に、ListViewItem.Horizo​​ntalContentAlignment を設定して (ListViewItem のセッターでスタイルを使用)、セル テンプレートが GridViewCell 全体を埋めるようにします。

もっと簡単な解決策があるかもしれませんが、これでうまくいくはずです。

注:このソリューションには、Window.Resources の Horizo​​ntalContentAlignment =Stretchと CellTemplate の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>
于 2009-02-18T11:23:53.280 に答える
39

コンテンツの幅が変更された場合は、次のコードを使用して各列を更新する必要があります。

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

    column.Width = double.NaN;
}

その列のデータが更新されるたびに起動する必要があります。

于 2009-12-19T00:14:54.243 に答える
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>

いくつかの例とソースコードへのリンクについては、次のリンクを参照してください http://lazycowprojects.tumblr.com/post/7063214400/wpf-c-listview-column-width-auto

于 2011-06-30T02:36:16.613 に答える
7

ItemContainerStyle があったので、ItemContainerStyle に Horizo​​ntalContentAlignment を配置する必要がありました

    <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" /> 
    ....
于 2011-08-01T16:03:20.277 に答える
6

常にすべての列のサイズを変更することを除いて、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);
    }        
}
于 2015-05-15T07:32:19.167 に答える
1

受け入れられた回答に問題がありました(Horizo​​ntalAlignment = Stretch部分を見逃し、元の回答を調整したため)。

これは別のテクニックです。SharedSizeGroupでグリッドを使用します。

注: ListViewのGrid.IsSharedScope=true

<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">
<Grid>
    <ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}" Grid.IsSharedSizeScope="True">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" Width="40">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                             <Grid>
                                  <Grid.ColumnDefinitions>
                                       <ColumnDefinition Width="Auto" SharedSizeGroup="IdColumn"/>
                                  </Grid.ColumnDefinitions>
                                  <TextBlock HorizontalAlignment="Right" Text={Binding Path=Id}"/>
                             </Grid>
                        </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>
于 2010-12-24T17:13:55.130 に答える