2011-10-13 11 views
8

Potrzebuję usunąć miejsce zajmowane przez Grid.Row. Jestem w stanie zwinąć (usunąć) kontrolkę, którą umieściłem w Grid.Row, ale ponieważ RowDefinition ma ustalony rozmiar (wysokość) nawet po usunięciu kontrolki potomnej, wciąż widzę pusty wiersz.Jak zwijanie wiersza poleceń?

Czy istnieje sposób na Collapse a RowDefinition/Grid.Row?

Dzięki za zainteresowanie.

+0

Możliwa duplikat [Ukryj wiersz siatki w WPF] (http://stackoverflow.com/questions/2502178/hide-grid-row-in-wpf) – Palec

Odpowiedz

1

Możesz zobaczyć here przykład manipulowania wierszami i kolumnami w siatce. Mimo że dokumentacja dotyczy .Net (WPF), nadal ma znaczenie dla WP7/Silverlight.

Ja osobiście pomyślałem dwa razy przed użyciem siatki w ten sposób. Może być, cokolwiek spróbujesz, można osiągnąć za pomocą panelu sterującego lub dowolnego innego elementu sterującego kontenera.

+0

Właśnie dla zakończenia użyłem grid.Rowdefinitions.RemoveAt (index). Zgadzam się, że umieszczenie StackPanel może być lepszym rozwiązaniem dla tego scenariusza. –

7

Użytkownik mógł ustawić RowDefinition.Height="Auto" i mógł przydzielić stałą wysokość rzeczywistemu obrazowi w tym wierszu. W ten sposób, gdy wizualnie jest widocznie collpased, wiersz nie zajmuje stałej szerokości, która została przypisana do definicji rzędu.

+0

to jest prosta odpowiedź na pytanie. Dzięki!. Wiem, że jest bardzo stary, ale zrobiłeś małą literówkę, napisał szerokość, kiedy miałeś na myśli wzrost. –

5

Ustawienie RowDefinition.Height ="Auto" nie nadaje się do wszystkich przypadków, ponieważ często chcemy * rozmiaru naszych wierszy.

Zamiast dynamicznie/programowo dodawać i usuwać wiersze z listy, łatwiejsze i bezpieczniejsze jest rozciąganie zawartości pierwszych wierszy w kolejnych wierszach.

Można to zrobić za pomocą narzędzia DataTrigger, aby ustawić Grid.RowSpan na pierwszym elemencie siatki. Poniżej znajduje się pełny przykład - wystarczy wkleić go do nowego okna WPF, aby zobaczyć je w akcji.

<Grid> 
     <Grid.Resources> 

      <BooleanToVisibilityConverter x:Key="visConverter"></BooleanToVisibilityConverter> 
     </Grid.Resources> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
     </Grid.RowDefinitions> 

     <Grid Grid.Row="0" Background="Orange"> 
      <Grid.Style> 
       <Style TargetType="Grid"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=toggle1, Path=IsChecked}" Value="False"> 
          <Setter Property="Grid.RowSpan" Value="3"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Grid.Style> 
     </Grid> 
     <GridSplitter Grid.Row="1" ResizeBehavior="PreviousAndNext" HorizontalAlignment="Stretch" Height="3" 
         Visibility="{Binding ElementName=toggle1, Path=IsChecked, Converter={StaticResource visConverter}}"></GridSplitter> 
     <Grid Name="bottomGrid" Grid.Row="2" Background="LightBlue" 
       Visibility="{Binding ElementName=toggle1, Path=IsChecked, Converter={StaticResource visConverter}}"> 
     </Grid> 
     <ToggleButton Name="toggle1" VerticalAlignment="Top">Hide/Show</ToggleButton> 
</Grid> 
1

Najpierw ustaw Name dla swojej siatki. Początkowo ustawić wysokość wierszy poprzez atrybut XAML:

<Grid Name="GridSize"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="3*"></RowDefinition> 
     <RowDefinition Height="1*"></RowDefinition> 
     <RowDefinition Height="2*"></RowDefinition> 
    </Grid.RowDefinitions> 
    <Grid Name="A" Grid.Row="0""></Grid> 
    <Grid Name="B" Grid.Row="1""></Grid> 
    <Grid Name="C" Grid.Row="2""></Grid> 
</Grid> 

Gdy chcesz zwinąć RowDefinition:

A.Visibility = Visibility.Collapsed; 
GridSize.RowDefinitions[0].Height = new GridLength(0); 

Gdy chcesz zrobić to ponownie widoczne:

A.Visibility = Visibility.Visible; 
GridSize.RowDefinitions[0].Height = new GridLength(3, GridUnitType.Star);