2012-11-11 31 views
2

我試圖使用DoubleAnimation來更改StackPanel的Height屬性。該代碼不會拋出任何異常。但動畫不起作用。故事板DoubleAnimation不適用於StackPanel高度屬性

  <StackPanel x:Name="FlyoutContent"> 

       <StackPanel.Resources> 
        <Storyboard x:Name="HideStackPanel"> 
         <DoubleAnimation Storyboard.TargetName="ChangePasswordPanel" Storyboard.TargetProperty="Height" From="190" To="0" Duration="0:0:1"> 
          <DoubleAnimation.EasingFunction> 
           <PowerEase EasingMode="EaseIn"></PowerEase> 
          </DoubleAnimation.EasingFunction> 
         </DoubleAnimation> 
        </Storyboard> 
        <Storyboard x:Name="ShowStackPanel"> 
         <DoubleAnimation Storyboard.TargetName="ChangePasswordPanel" Storyboard.TargetProperty="Height" From="0" To="190" Duration="0:0:1"> 
          <DoubleAnimation.EasingFunction> 
           <PowerEase EasingMode="EaseIn"></PowerEase> 
          </DoubleAnimation.EasingFunction> 
         </DoubleAnimation> 
        </Storyboard> 
       </StackPanel.Resources> 

       <TextBlock Margin="0, 20, 0, 0" FontWeight="Bold" Text="Change Current Password" TextWrapping="Wrap" Style="{StaticResource BasicTextStyle}" HorizontalAlignment="Left" IsTapEnabled="True" Tapped="ChangePasswordHeader_Tapped"/> 
       <StackPanel x:Name="ChangePasswordPanel" Margin="0, 5, 0, 0" Height="0"> 

C#事件處理程序

private void ChangePasswordHeader_Tapped(object sender, TappedRoutedEventArgs e) 
{ 
    if (ChangePasswordPanel.Height == 0) 
    { 
     ShowStackPanel.Begin(); 
    } 
    else 
    { 
     HideStackPanel.Begin(); 
    } 
} 

它擊中ChangePasswordHeader_Tapped事件處理程序,並按照預期執行ShowStackPanel.Begin或HideStackPanel.Begin聲明。但它對輸出沒有任何影響。 StackPanel的高度只保留在0.

關於發生了什麼的任何想法?

+0

您可以使用Grid而不是StackPanel。 – Clemens

+0

與使用網格相同的結果。動畫不起作用。 –

+0

與寬度屬性相同的問題,也是同樣的解決方案。 –

回答

11

我想出了自己。我所要做的只是在DoubleAnimation上啓用相關動畫(EnableDependentAnimation),因爲此動畫會影響佈局。然後它完美地工作。

     <Storyboard x:Name="HideChangePasswordPanel"> 
          <DoubleAnimation EnableDependentAnimation="True" Storyboard.TargetName="ChangePasswordPanel" Storyboard.TargetProperty="Height" From="190" To="0" Duration="0:0:0.2"> 
           <DoubleAnimation.EasingFunction> 
            <PowerEase EasingMode="EaseIn"></PowerEase> 
           </DoubleAnimation.EasingFunction> 
          </DoubleAnimation> 
         </Storyboard> 
         <Storyboard x:Name="ShowChangePasswordPanel"> 
          <DoubleAnimation EnableDependentAnimation="True" Storyboard.TargetName="ChangePasswordPanel" Storyboard.TargetProperty="Height" From="0" To="190" Duration="0:0:0.2"> 
           <DoubleAnimation.EasingFunction> 
            <PowerEase EasingMode="EaseIn"></PowerEase> 
           </DoubleAnimation.EasingFunction> 
          </DoubleAnimation> 
         </Storyboard> 

希望它能節省一些時間!

+1

你是否總是知道UI的高度?你不能使用這種技術回到「自動」高度,你能嗎? – WiredPrairie

+0

解決方案確認也適用於寬度屬性。 –

0

堆疊面板從其內容的組合高度取其高度。顯式設置高度沒有意義。

您需要更改堆疊面板內容的高度/可見性。

1

通常在XAML(和Silverlight/WPF)中動畫化UI組件大小的最簡單方法是使用RenderTransform。根據佈局,您可能需要做一些技巧,但對於快速動畫,它通常看起來非常好。

<Storyboard x:Name="Storyboard1"> 
<DoubleAnimation Duration="0:0:2" 
     To="0" 
     Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" 
     Storyboard.TargetName="StatListView" d:IsOptimized="True"/> 
<DoubleAnimation Duration="0:0:2" 
     To="0" 
     Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" 
     Storyboard.TargetName="StatListView" d:IsOptimized="True"/> 
</Storyboard>