代码之家  ›  专栏  ›  技术社区  ›  Gabe

Silverlight情节提要中的收缩面板

  •  4
  • Gabe  · 技术社区  · 16 年前

    现在我有两个对象基本上,当你点击objectA上的按钮,一个故事板开始围绕x轴旋转并折叠它。然后通过将objectB的可见性设置为visible来显示objectB,并将其旋转到视图中。

    我想添加的是,当情节提要发生在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>
    
    2 回复  |  直到 16 年前
        1
  •  5
  •   iCollect.it Ltd    16 年前

    如果它只是你想要影响的视觉宽度,请将以下内容添加到你的故事板中。当控件翻转时,它将显示控件在远处移动和向后移动的外观:

        <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>
    
        2
  •  0
  •   Dan Auclair    16 年前

    问题是Width和Margin属性都不是dependencProperties,因此无法设置动画。在解决方法中,要实现这一点,需要向后面的用户控制代码添加一些自定义的dependencProperties,这些代码可以连接到情节提要,并反过来操作对象的实际属性。

    例如,您可以将此DependencyProperty添加到UserControl,它基本上允许设置对象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;
    }
    

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

    还需要将x:Name=“MyControl”添加到顶级UserControl。它有点粗糙,但是它可以为元素的一些基本属性设置动画,而这些属性恰好不是dependencProperty。