tags:

views:

2944

answers:

7

I have 2 columns in a Grid. When I click a button, I want the first column to animate to the left from it's current position to 0. So, in effect, it collapses and I'm left with just viewing a single column.

+6  A: 

Shouldn't be too hard. You'd need to create an EventTrigger that has a BeginStoryboard that targets the grid and uses a DoubleAnimation to shrink the column width. The example here has a similar setup. The EventTrigger would go on the button and the DoubleAnimation's StoryBoard.Target would point to the ColumnDefinition you wish to shrink.

Okay, so that doesn't work so well. You can't shrink the column directly, but you CAN set the shrinking column to fill (width="*"), set the width of the Grid and the non-shrinking column, and then shrink the entire grid. This does work. The below example works:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  WindowTitle="Opacity Animation Example" Background="White">
  <StackPanel Margin="20">
  <Grid Name="MyGrid" Width="200" HorizontalAlignment="Left">
  <Grid.RowDefinitions>
  <RowDefinition Height="100"/>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
  <ColumnDefinition Width="*"/>
  <ColumnDefinition Width="100"/>
  </Grid.ColumnDefinitions>
  <Rectangle HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" Grid.Column="0" Fill="Red"/>
  <Rectangle HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" Grid.Column="1" Fill="Blue"/>
  </Grid>

    <Button Name="hideButton">
      Hide
      <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation 
                Storyboard.TargetName="MyGrid"
                Storyboard.TargetProperty="(Grid.Width)" 
                From="200" To="100" Duration="0:0:2" AutoReverse="True"  /> 
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger>
      </Button.Triggers>
    </Button>
  </StackPanel>
</Page>
Will
+1  A: 

Another thing you can do is animate the contents and set the Grid to autosize to content which it will do smoothly as the contents changes size.

Nidonocu
A: 

You can also achieve this with GridLength animation , see an example here http://marlongrech.wordpress.com/2007/08/20/gridlength-animation/ Using this approach you can manipulate any given Grid.Column or Grid.Row size.

For your special need just put first column with Width="Auto" and second with *, animate the with of the content inside the first column- that will do the trick.

Jobi Joy
A: 

You might look at Dan Crevier's PanelLayoutAnimator.

Ed Ball
A: 

You can also use the Reveal control from Kevin's bag-o-tricks, http://j832.com/bagotricks/

Nir
+3  A: 

Check out this video training link, from Todd Miranda that shows you how to animate the height of a grid control. I think you could easily make it work for your case.

Entrodus
A: 

I have taken Todd Miranda's C# source code and modified it, to demonstrate how to animate DataGrid Column widths shrinking & expanding.

Here's the source code...

http://www.pocketpctoolkit.com/WPF/DataGridColumnWidthAnimation.zip

Basically, you click on a CheckBox, and whichever DataGrid columns have their "MinWidth" value set to 0 will be shrunk to zero-width. Click the CheckBox again, the columns will animate back to their original widths.

This WPF code also demonstrates how to create animations / storyboards in code behind.

Mike Gledhill