2010-08-03 40 views
4

我希望通過點擊一個按鈕來縮小項目的寬度。Silverlight Storyboard中的縮小面板

現在我基本上有兩個對象,當你點擊objectA上的按鈕時,一個故事板開始繞X軸旋轉並摺疊它。然後它通過將它的可見性設置爲可見並將其旋轉到視圖中來顯示objectB。

我想要添加的所有內容是,在storyboard發生在objectA和objectB的情況下,設置較小的寬度,然後在故事板結束時將其設置回正常。

我嘗試設置厚度,但我得到了編譯時錯誤,抱怨它是隻讀的。

<ObjectAnimationUsingKeyFrames 
      BeginTime="00:00:00" 
      Storyboard.TargetName="objectA" 
      Storyboard.TargetProperty="(UIElement.Margin)"> 
     <DiscreteObjectKeyFrame KeyTime="00:00:00"> 
     <DiscreteObjectKeyFrame.Value> 
      <Thickness Left="10" Right="10"/> 
     </DiscreteObjectKeyFrame.Value> 
     </DiscreteObjectKeyFrame> 
    </ObjectAnimationUsingKeyFrames> 

我有一個簡單的佈局現在...

這是我UI XAML:

<StackPanel> 
    <Border x:Name="objectA" BorderBrush="Blue" BorderThickness="1" Height="100" Width="100"> 
     <StackPanel> 
     <TextBox Margin="10"></TextBox> 
     <Button Width="50" x:Name="btn1" Content="Flip" Click="btn1_Click"/> 
     </StackPanel> 
    <Border.Projection> 
     <PlaneProjection RotationX="0"></PlaneProjection> 
    </Border.Projection> 
    </Border> 

    <Border Visibility="Collapsed" x:Name="objectB" BorderBrush="Red" BorderThickness="1" Height="100" Width="100"> 
    <StackPanel> 
     <TextBox Margin="10"></TextBox> 
     <Button Width="50" x:Name="btn2" Content="Flip" Click="btn2_Click"/> 
    </StackPanel> 
    <Border.Projection> 
     <PlaneProjection RotationX="90"></PlaneProjection> 
    </Border.Projection> 
    </Border> 

這裏是故事板...

<Storyboard x:Name="Storyboardtest"> 
      <DoubleAnimation BeginTime="00:00:00" 
       Storyboard.TargetName="objectA" 
       Storyboard.TargetProperty="(UIElement.Projection).(RotationX)" 

       From="0" To="-90"> 
      </DoubleAnimation> 
      <ObjectAnimationUsingKeyFrames 
       BeginTime="00:00:01" 
       Storyboard.TargetName="objectA" 
       Storyboard.TargetProperty="(UIElement.Visibility)"> 

       <DiscreteObjectKeyFrame KeyTime="00:00:00"> 
        <DiscreteObjectKeyFrame.Value> 
         <Visibility>Collapsed</Visibility> 
        </DiscreteObjectKeyFrame.Value> 
       </DiscreteObjectKeyFrame> 

      </ObjectAnimationUsingKeyFrames> 

      <ObjectAnimationUsingKeyFrames 
       BeginTime="00:00:01" 
       Storyboard.TargetName="objectB" 
       Storyboard.TargetProperty="(UIElement.Visibility)"> 

       <DiscreteObjectKeyFrame KeyTime="00:00:00"> 
        <DiscreteObjectKeyFrame.Value> 
         <Visibility>Visible</Visibility> 
        </DiscreteObjectKeyFrame.Value> 
       </DiscreteObjectKeyFrame> 

      </ObjectAnimationUsingKeyFrames> 

      <DoubleAnimation BeginTime="00:00:01" 
       Storyboard.TargetName="objectB" 
       Storyboard.TargetProperty="(UIElement.Projection).(RotationX)" 

       From="90" To="0"> 
      </DoubleAnimation> 

     </Storyboard> 
+0

對不起,您是否想更改控件佔用的實際大小,或者只是直觀地縮小控件寬度(例如,使用縮放比例)?謝謝。 – 2010-08-18 22:25:11

回答

5

如果它只是視覺您想要影響的寬度,請將以下內容添加到故事板。它會給移動到距離控件的外觀和背部,因爲它翻轉:

<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="objectA"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0.5"/> 
    </DoubleAnimationUsingKeyFrames> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="objectB"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0.5"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:2" Value="1"/> 
    </DoubleAnimationUsingKeyFrames> 

您還需要添加爲我所用Expression Blend中添加動畫以下並會自動添加任何必需的元素:

<Border x:Name="objectA" BorderBrush="Blue" BorderThickness="1" Height="100" Width="100" RenderTransformOrigin="0.5,0.5"> 
     <Border.RenderTransform> 
      <CompositeTransform/> 
     </Border.RenderTransform> 

[剪斷]

<Border Visibility="Collapsed" x:Name="objectB" BorderBrush="Red" BorderThickness="1" Height="100" Width="100" RenderTransformOrigin="0.5,0.5"> 
     <Border.RenderTransform> 
      <CompositeTransform/> 
     </Border.RenderTransform> 
+0

當我將代碼放入示例中時出現此錯誤。 '無法解析指定對象上的TargetProperty(UIElement.RenderTransform)。(CompositeTransform.ScaleX)。「# – Gabe 2010-08-19 14:16:03

+0

您會注意到在我缺失的XAML片段中,我添加了2個邊框上的RenderTransformOrigin =」0.5,0.5「。這意味着縮放將發生在中心附近而不是默認值。對不起,我遺漏了一些細節。 – 2010-08-19 16:21:00

+0

非常好,謝謝親切的先生。 – Gabe 2010-08-19 16:31:14

0

的問題是,無論是寬度和Margin特性不DependencyProperties所以它們不能被動畫。在解決方法中,要完成此操作,需要將一些自定義DependencyProperties添加到您的用戶控制代碼後面,從而可以將它們連接到故事板並反過來操縱對象的實際屬性。

例如,你可以添加此的DependencyProperty到您的用戶控件基本上允許對象A的Width屬性的設置:

public static readonly DependencyProperty ObjectWidthProperty = DependencyProperty.Register(
    "ObjectWidth", 
    typeof(double), 
    typeof(MainPage), 
    new PropertyMetadata(50.0, new PropertyChangedCallback(OnObjectWidthChanged))); 

public double ObjectWidth 
{ 
    get { return (double)GetValue(ObjectWidthProperty); } 
    set { SetValue(ObjectWidthProperty, value); } 
} 

private static void OnObjectWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    ((MainPage)d).OnObjectWidthChanged(e); 
} 

private void OnObjectWidthChanged(DependencyPropertyChangedEventArgs e) 
{ 
    this.objectA.Width = this.ObjectWidth; 
} 

然後,您可以添加以下到你的故事板這將動畫對象A的寬度從50像素降至0:

<DoubleAnimation BeginTime="00:00:00" 
       Storyboard.TargetName="MyControl" 
       Storyboard.TargetProperty="ObjectWidth" 
       From="50" To="0"/> 

還需要您將x:Name =「MyControl」添加到您的頂級UserControl。這有點不好意思,但它有助於動畫化一些不屬於DependencyPropertys的元素的基本屬性。

+0

雖然這個工作,我不想縮小整個用戶控制...但也許我可以使用它作爲一個起點:) – Gabe 2010-08-19 15:36:24

+0

這實際上並沒有收縮整個用戶控件,只是objectA。因爲故事板不能直接更改objectA的Width屬性,所以DependencyProperty僅暴露在用戶控件上以操縱objectA的寬度。 – 2010-08-19 16:31:01