2014-10-01 2 views
0

Это выглядит просто, но это невероятно сложно.Раскладка ListView

Я хочу иметь такое расположение:

Это ListView, который должен принять максимальную высоту кнопок (количество видимых кнопок динамично).

Я попробовал этот

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 

    ... 

    <Grid Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 

     <StackPanel> 
      <Button/> 
      <Button/> 
      ... 
     </StackPanel> 

     <ListView Grid.Column="1"/> 

    </Grid> 
</Grid> 

Проблема: ListView имеет очень странное поведение для размера себя к содержимому. Если я добавлю много элементов, то вдруг это займет все пространство окна.

Вопрос: как ограничить ListView высота не должна превышать кнопки общая высота (StackPanel высота)?

P.S .: mvvm, поэтому рекомендуется использовать чистую xaml.

P.S.S .: У меня есть чувство, что это будет привязка чего-то к чему-то. Но о чем к чему?

+0

Вставить обе кнопки и список в свою панель, а затем просто беспокоиться о выравнивании влево и вправо? – Sayse

+0

@Sayse, почему это поможет? Что остановит «ListView» от увеличения панели и роста? – Sinatr

+0

, потому что вы ограничиваете его размер размером своего владельца, а затем убедитесь, что панель зафиксирована в высоте – Sayse

ответ

1

Вам просто нужно привязать данные ActualHeight вашей StackPanel к ListView.Height, так что ListView не будет расти больше, чем Button «s StackPanel:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Grid Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <StackPanel Name="ButtonPanel" Grid.Column="0"> 
      <Button Content="Click" /> 
      <Button Content="Click" /> 
      <Button Content="Click" /> 
     </StackPanel> 
     <ListView Grid.Column="1" ItemsSource="{Binding Tests}" 
      Height="{Binding ActualHeight, ElementName=ButtonPanel}" /> 
    </Grid> 
</Grid> 
+0

Ты спас меня снова! Благодарю. (и да, мне стыдно за то, что я еще не смог решить эту проблему) – Sinatr

+0

Мы живем и учимся. В прошлом я бы тоже поставил меня в тупик. :) – Sheridan

1

Вы можете связать MaxHeight свойства нижнего сетью содержимого до ActualHeight кнопок StackPanel. Еще больше, вам нужно установить VerticalAlignment панели кнопок на Bottom.

Таким образом, вы можете добавить больше деталей по вертикали, но при этом придерживаться высоты панели кнопок.

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 

    ... 

    <Grid Grid.Row="1" 
      MaxHeight="{Binding ElementName=ButtonPanel, Path=ActualHeight}"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 

     <StackPanel Name="ButtonPanel" 
        VerticalAlignment="Bottom"> 
      <Button Content="Button"/> 
      <Button Content="Button"/> 
      <Button Content="Button"/> 
     </StackPanel> 

     <ListView Grid.Column="1"/> 

     <!-- Multiple controls can be added here, 
      but the lower part will still stick 
      to the size of the buttons panel --> 
    </Grid> 
</Grid> 
+0

Это также работает, спасибо. Но это более теневое * (менее очевидное), чем решение Шеридана. – Sinatr

Смежные вопросы