Mam ListView z GridView z 3 kolumnami. Chcę, aby ostatnia kolumna zajęła pozostałą szerokość ListView.WPF: Rozszerz ostatnia kolumna GridView ListView
Odpowiedz
Nie można tego zrobić za pomocą zwykłego XAML, ale istnieje kilka rozwiązań. Sprawdź to:
Link do ListView Manager jest dokładnie tym, czego potrzebowałem. Dziękujemy za publikację. – scobi
Jest sposób, aby to zrobić za pomocą zachowania zależnego
<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 do niektórych przykładów i łącza, aby przeczytać więcej http://lazycowprojects.tumblr.com/post/7063214400/wpf-c-listview-column-width-auto
I do zobaczenia e kod źródłowy. Sprawdź https://github.com/rolfwessels/lazycowprojects/tree/master/Wpf
"Zachowania: GridViewColumnResize.Width" i "Behaviors: GridViewColumnResize.Enabled" nie istnieje w WPF; używasz frameworku innej firmy? Przydałoby się to wspomnieć. Teraz rezygnujesz, dopóki twoja odpowiedź nie zostanie naprawiona/zaktualizowana. – Krythic
@Krythic myślę, że mogłeś pominąć sekcję, którą wyjaśniam, że musisz dodać kod źródłowy. Nazywa się to zachowaniami ... jest częścią wpf. Zobacz link github, Dodaj to do swojego kodu źródłowego. –
Hmm, napisałem, że w 2011 roku tak naprawdę nie robię WPF, ale wyobrażam sobie, że problem ten jest już rozwiązany. –
szybkie & brudną
XAML:
<ListView SizeChanged="ListView_SizeChanged" Loaded="ListView_Loaded" >
<ListView.View>
<GridView>
<GridViewColumn Header="col1" Width="100" />
<GridViewColumn Header="col1" Width="Auto" />
<GridViewColumn Header="col1" />
</GridView>
</ListView.View>
</ListView>
CS:
private void ListView_SizeChanged(object sender, SizeChangedEventArgs e)
{
UpdateColumnsWidth(sender as ListView);
}
private void ListView_Loaded(object sender, RoutedEventArgs e)
{
UpdateColumnsWidth(sender as ListView);
}
private void UpdateColumnsWidth(ListView listView)
{
int autoFillColumnIndex = (listView.View as GridView).Columns.Count - 1;
if (listView.ActualWidth == Double.NaN)
listView.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
double remainingSpace = listView.ActualWidth;
for (int i = 0; i < (listView.View as GridView).Columns.Count; i++)
if (i != autoFillColumnIndex)
remainingSpace -= (listView.View as GridView).Columns[i].ActualWidth;
(listView.View as GridView).Columns[autoFillColumnIndex].Width = remainingSpace >= 0 ? remainingSpace : 0;
}
Jak o użyciu stylu
<Style x:Key="GridViewExtraStyle" TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="Background" Value="{x:Null}"/>
<Setter Property="Foreground" Value="{x:Null}"/>
<Setter Property="BorderBrush" Value="{x:Null}"/>
<Setter Property="Width" Value="1000"/>
</Style>
<ListView>
<ListView.View>
<GridView>
<GridViewColumn Header="Abc"/>
<GridViewColumn Header="" HeaderContainerStyle="{DynamicResource GridViewExtraStyle}"/>
</GridView>
</ListView.View>
</ListView>
To jest najlepsza odpowiedź, jaką widziałem. Prosty i skuteczny. – Joe
Niestety, masz długi poziomy pasek przewijania, aby poradzić sobie z –
użyłem sugestię Pale Ales męska z niewielką zmianą:
<Style x:Key="GridViewExtraStyle" TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="Background" Value="{x:Null}"/>
<Setter Property="Foreground" Value="{x:Null}"/>
<Setter Property="BorderBrush" Value="{x:Null}"/>
</Style>
<ListView>
<ListView.View>
<GridView ColumnHeaderContainerStyle="{DynamicResource GridViewExtraStyle}">
<GridViewColumn Header="Abc" Width="{Binding Path=mywidth}"/>
</GridView>
</ListView.View>
</ListView>
Nie można usunąć ostatnią kolumnę ale można Koncentracja trochę złudzenie.
<ControlTemplate TargetType="GridViewColumnHeader">
<Grid>
<ContentPresenter x:Name="HeaderContent"
Content="{TemplateBinding Content}" ... />
<Thumb x:Name="PART_HeaderGripper" ... />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasContent"
Value="false">
<Setter Property="Visibility"
Value="Collapsed"
TargetName="PART_HeaderGripper" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
OP nie chce ukryć ostatniej kolumny, chcą ją rozszerzyć, aby wypełnić pozostałą szerokość – JumpingJezza
Nie widziałem jednoliniowego/prostego rozwiązania tylko XAML. Ustaw szerokość, która jest odpowiednia do widoku projektu, a następnie zmodyfikować szerokość na zmianę rozmiaru okna jak poniżej:
Private Sub winMain_SizeChanged(sender As Object, e As SizeChangedEventArgs) Handles Me.SizeChanged
TryCast(lvwDownload.View, GridView).Columns(3).Width = lvwDownload.ActualWidth - 340
End Sub
UWAGA: Ta logika nie zmienia/najechaniu szerokość kolumny, gdy inny jest zmieniany. Świetnie nadaje się do wypełniania listview ostatnią kolumną.
Oto [świetny link] (http://stackoverflow.com/questions/5573152/how-to-resize-a-ertain-control-based-on-window-size-in-wpf#5573895), który to prawda. – FodderZone