Grid mesh that changes width during animation

I have a Grid element that has two columns and three rows. The last line has a height of 0 ... and I'm animating the height property with a custom animation class, because the gridheight property is not an integer.

The animation works just fine, but when I activate it, it changes the width of the second column, it would seem, at random .. sometimes itโ€™s just a few pixels more, and sometimes twice as many ...

Here is the grid code

<Grid > <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition Width="50"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="1*" /> <RowDefinition Height="7"/> <RowDefinition Name="LyricsRow" Height="1"> <RowDefinition.Style> <Style> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsTrayOpen}" Value="True"> <DataTrigger.EnterActions> <BeginStoryboard> <Storyboard> <local:GridLengthAnimation Storyboard.TargetProperty="Height" From="0" To="150" Duration="0:0:0.3" > </local:GridLengthAnimation> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> <DataTrigger.ExitActions> <BeginStoryboard> <Storyboard> <local:GridLengthAnimation Storyboard.TargetProperty="Height" From="150" To="0" Duration="0:0:0.5" /> </Storyboard> </BeginStoryboard> </DataTrigger.ExitActions> </DataTrigger> </Style.Triggers> </Style> </RowDefinition.Style> </RowDefinition> </Grid.RowDefinitions> 

Are there any reasons this could happen?

+3
source share
2 answers

This probably depends on the contents of the cells.

try setting MaxWidth = "50" to your column in addition to width = "50"

+3
source

For those of you who may be interested in the implementation of the GridLengthAnimation mentioned in the question, here is one (from http://social.msdn.microsoft.com/forums/en-US/wpf/thread/da47a4b8-4d39-4d6e-a570-7dbe51a842e4 / )

 /// <summary> /// Animates a grid length value just like the DoubleAnimation animates a double value /// </summary> public class GridLengthAnimation : AnimationTimeline { /// <summary> /// Returns the type of object to animate /// </summary> public override Type TargetPropertyType { get { return typeof(GridLength); } } /// <summary> /// Creates an instance of the animation object /// </summary> /// <returns>Returns the instance of the GridLengthAnimation</returns> protected override System.Windows.Freezable CreateInstanceCore() { return new GridLengthAnimation(); } /// <summary> /// Dependency property for the From property /// </summary> public static readonly DependencyProperty FromProperty = DependencyProperty.Register("From", typeof(GridLength), typeof(GridLengthAnimation)); /// <summary> /// CLR Wrapper for the From depenendency property /// </summary> public GridLength From { get { return (GridLength)GetValue(GridLengthAnimation.FromProperty); } set { SetValue(GridLengthAnimation.FromProperty, value); } } /// <summary> /// Dependency property for the To property /// </summary> public static readonly DependencyProperty ToProperty = DependencyProperty.Register("To", typeof(GridLength), typeof(GridLengthAnimation)); /// <summary> /// CLR Wrapper for the To property /// </summary> public GridLength To { get { return (GridLength)GetValue(GridLengthAnimation.ToProperty); } set { SetValue(GridLengthAnimation.ToProperty, value); } } /// <summary> /// Animates the grid let set /// </summary> /// <param name="defaultOriginValue">The original value to animate</param> /// <param name="defaultDestinationValue">The final value</param> /// <param name="animationClock">The animation clock (timer)</param> /// <returns>Returns the new grid length to set</returns> public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock) { double fromVal = ((GridLength)GetValue(GridLengthAnimation.FromProperty)).Value; //check that from was set from the caller if (fromVal == 1) //set the from as the actual value fromVal = ((GridLength)defaultDestinationValue).Value; double toVal = ((GridLength)GetValue(GridLengthAnimation.ToProperty)).Value; if (fromVal > toVal) return new GridLength((1 - animationClock.CurrentProgress.Value) * (fromVal - toVal) + toVal, GridUnitType.Star); else return new GridLength(animationClock.CurrentProgress.Value * (toVal - fromVal) + fromVal, GridUnitType.Star); } } 
+6
source

Source: https://habr.com/ru/post/1487766/


All Articles