Jak mogę:
- wyrównaj tekst w kolumnie ID do prawej
- ustawić rozmiar każdej kolumny zgodnie z długością tekstu komórki z najdłuższymi widocznymi danymi?
Oto kod:
<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>
odpowiedź częściowa:
Dzięki Kjetil, GridViewColumn.CellTemplate działa dobrze, a automatyczna szerokość działa oczywiście, ale kiedy „Kolekcja” ObservativeCollection jest aktualizowana danymi dłuższymi niż szerokość kolumny, rozmiary kolumn nie aktualizują się same, więc jest to tylko rozwiązanie dla początkowe wyświetlanie danych:
<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>
Odpowiedzi:
Aby automatycznie zmienić rozmiar każdej kolumny, można ustawić Width = "Auto" w GridViewColumn.
Aby wyrównać tekst w kolumnie ID, możesz utworzyć szablon komórki za pomocą TextBlock i ustawić TextAlignment. Następnie ustaw ListViewItem.HorizontalContentAlignment (przy użyciu stylu z funkcją ustawiającą w ListViewItem), aby szablon komórki wypełnił całą GridViewCell.
Może jest prostsze rozwiązanie, ale powinno działać.
Uwaga: rozwiązanie wymaga zarówno HorizontalContentAlignment = Stretch w Window.Resources, jak i TextAlignment = Right w CellTemplate.
<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>
źródło
Jeśli szerokość treści się zmieni, będziesz musiał użyć tego fragmentu kodu, aby zaktualizować każdą kolumnę:
Będziesz musiał go odpalać za każdym razem, gdy dane dla tej kolumny zostaną zaktualizowane.
źródło
Jeśli Twój widok listy również zmienia rozmiar, możesz użyć wzorca zachowania, aby zmienić rozmiar kolumn, aby pasowały do pełnej szerokości ListView. Prawie to samo, co przy użyciu definicji 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>
Zobacz poniższy link, aby uzyskać kilka przykładów i link do kodu źródłowego http://lazycowprojects.tumblr.com/post/7063214400/wpf-c-listview-column-width-auto
źródło
Utworzyłem następującą klasę i użyłem jej w całej aplikacji wszędzie tam, gdzie jest to wymagane zamiast
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); } }
źródło
Ponieważ miałem ItemContainerStyle, musiałem umieścić HorizontalContentAlignment w 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" /> ....
źródło
Podobało mi się rozwiązanie user1333423, poza tym, że zawsze zmieniało rozmiar każdej kolumny; Musiałem pozwolić niektórym kolumnom mieć stałą szerokość. Dlatego w tej wersji kolumny z szerokością ustawioną na „Auto” będą automatycznie dopasowywane, a kolumny ustawione na stałą kwotę nie będą automatycznie dopasowywane.
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); } }
źródło
Wiem, że jest już za późno, ale oto moje podejście:
<GridViewColumn x:Name="GridHeaderLocalSize" Width="100"> <GridViewColumn.Header> <GridViewColumnHeader HorizontalContentAlignment="Right"> <Grid Width="Auto" HorizontalAlignment="Right"> <Grid.ColumnDefinitions> <ColumnDefinition Width="100"/> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" Text="Local size" TextAlignment="Right" Padding="0,0,5,0"/> </Grid> </GridViewColumnHeader> </GridViewColumn.Header> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Width="{Binding ElementName=GridHeaderLocalSize, Path=Width, FallbackValue=100}" HorizontalAlignment="Right" TextAlignment="Right" Padding="0,0,5,0" Text="Text" > </TextBlock> </DataTemplate> </GridViewColumn.CellTemplate>
Głównym pomysłem jest powiązanie szerokości elementu cellTemplete z szerokością ViewGridColumn. Szerokość = 100 jest domyślną szerokością używaną do pierwszej zmiany rozmiaru. Nie ma żadnego kodu. Wszystko jest w XAML.
źródło
Miałem problem z zaakceptowaną odpowiedzią (ponieważ przegapiłem część HorizontalAlignment = Stretch i dostosowałem oryginalną odpowiedź).
To jest inna technika. Używa siatki z SharedSizeGroup.
Uwaga: Grid.IsSharedScope = true na ListView.
<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>
źródło
GridViewColumn
as40
i ustawiłeś szerokość definicji kolumny naAuto
? To nie ma sensu.Utworzyłem funkcję do aktualizowania nagłówków kolumn GridView dla listy i wywołuj ją za każdym razem, gdy okno jest zmieniane lub listview aktualizuje swój układ.
public void correctColumnWidths() { double remainingSpace = myList.ActualWidth; if (remainingSpace > 0) { for (int i = 0; i < (myList.View as GridView).Columns.Count; i++) if (i != 2) remainingSpace -= (myList.View as GridView).Columns[i].ActualWidth; //Leave 15 px free for scrollbar remainingSpace -= 15; (myList.View as GridView).Columns[2].Width = remainingSpace; } }
źródło
To jest twój kod
<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>
Spróbuj tego
<ListView Name="lstCustomers" ItemsSource="{Binding Path=Collection}"> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding Id}" Width="Auto"> <GridViewColumnHeader Content="ID" Width="Auto" /> </GridViewColumn> <GridViewColumn DisplayMemberBinding="{Binding FirstName}" Width="Auto"> <GridViewColumnHeader Content="First Name" Width="Auto" /> </GridViewColumn> <GridViewColumn DisplayMemberBinding="{Binding LastName}" Width="Auto"> <GridViewColumnHeader Content="Last Name" Width="Auto" /> </GridViewColumn </GridView> </ListView.View> </ListView>
źródło