2010-11-22 28 views
3

我有一個Grid元素,它有兩列和三行。最後一行的高度爲0 ...我使用自定義動畫類爲height屬性設置動畫,因爲gridheight屬性不是整數。網格列更改動畫時的寬度

動畫工作得很好,但是當我激活它時,它會更改第二列的寬度看似隨機..有時只是幾個像素更大,有時在雙寬...

這裏是電網碼

<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> 

是否有這可能進行的任何原因?

回答

3

它可能依賴於「細胞」

的內容儘量除了WIDTH =「50」

+0

這工作..感謝了很多 – Ryan 2010-11-23 04:24:12

6

對於那些你在你的columnDefinition設置MaxWidth =「50」可能想了解在問題中提到的GridLengthAnimation實施,這裏是一個(從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); 
    } 
} 
+1

謝謝!我不得不改變** fromVal =((GridLength)defaultDestinationValue).Value; ** to ** fromVal =((GridLength)defaultOriginValue).Value; **。但除此之外,它是完美的。 – Xtr 2015-09-07 09:34:48