1

WPFには、次のものがあります。

<ListView.View>
    <GridView>
        <GridViewColumn
            Width="Auto"
            DisplayMemberBinding="{Binding SomeProperty, Mode=OneWay}"
            Header="Type"/>

問題は、これが表示されるコンテンツに合わせて列のサイズを自動調整するだけであることです。これは、ヘッダー ディバイダをダブルクリックした場合も同じ動作です。

すべてのコンテンツに応じて列のサイズを変更したい。対照的にDataGridView、現在の自動サイズ変更動作と同等の Winforms と、目的の動作と同等の Winforms を取り上げます。

this.dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; // Current behavior
this.dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;       // Desired behavior

これは WPF で可能ListViewですか?

この質問は、WPF で GridViewColumn データを自動サイズ調整して右揃えにする方法とは異なります。また、表示されているコンテンツの現在のサイズ変更動作を引き続きトリガーし、すべてのコンテンツに対処しないため、それを好む人もいます。

4

1 に答える 1

2

問題は、ListViewデフォルトItemsPanelで仮想化が有効になっていることです。このモードでは、表示可能なコンテンツのみがレンダリングされ、列の自動サイズ変更がトリガーされます。に多くのアイテムがない場合はListView、添付プロパティを介して仮想化モードをオフにするVirtualizingStackPanel.IsVirtualizingと、期待どおりに機能します。

<ListView VirtualizingStackPanel.IsVirtualizing="false">
       <!-- ... -->
</ListView>

仮想化をオフにしたくない場合は、 を利用する簡単な方法はないと思いますWidth="Auto"。その機能を自分で手動で実装する必要がある場合があります。技術的には、それに応じて列の幅を更新するには、最大幅に関する知識が必要です。列の幅を更新する必要があるたびに for ループを作成できますが、これはコストがかかります。また、セルのコンテンツが変更されるたびに最大幅を保存することもできます (これがより良い方法です)。とにかく手動で行うのは面倒です。

于 2015-09-30T02:02:03.103 に答える