约束PlaneProjection的维度

时间:2011-07-26 05:38:25

标签: silverlight

如何将平面投影约束到特定尺寸?例如,我有以下内容:

    <Canvas  Width="720" Height="540" x:Name="Root" Background="Red"  >
        <Line Width="200" Height="5" X1="0" X2="200" 
            Y1="0" Y2="0" Stroke="LimeGreen" StrokeThickness="10"
            Canvas.Left="260" Canvas.Top="70" />
        <Rectangle Width="200" Height="400" Stroke="Blue" StrokeThickness="6" 
            Fill="LightBlue"  Opacity="0.5" Canvas.Left="260" Canvas.Top="70">
            <Rectangle.Projection>
                <PlaneProjection x:Name="box" />
            </Rectangle.Projection>
        </Rectangle>
        <Line Width="200" Height="10" X1="0" X2="200" 
            Y1="0" Y2="0" Stroke="LimeGreen" StrokeThickness="10"
            Canvas.Left="260" Canvas.Top="464" />
    </Canvas>

我想围绕Y轴旋转360度,但绝不希望投影超过矩形高度的边界 - 在这种情况下,400点。

故事板,只是为了简单的测试,是一个触发器。

<UserControl.Triggers>
    <EventTrigger>
        <BeginStoryboard>
            <Storyboard>
                <DoubleAnimation Storyboard.TargetName="box"
                                 Storyboard.TargetProperty="RotationY"
                                 By="360" Duration="0:0:15"
                                 RepeatBehavior="Forever" />
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</UserControl.Triggers>

1 个答案:

答案 0 :(得分:0)

这并不完美,因为它是线性插值,高度与旋转角度的实际关系是一个轻微的正弦曲线,但接近你想要的。

它基本上在总时间的四分之一中将Y缩放到0.88(并且是自动反转)。

您可以像使用“box”一样简化元素命名(如果您愿意的话)(我使用Blend编写/测试故事板,它总是创建长元素名称):

            <Storyboard>
                <DoubleAnimation Storyboard.TargetName="box"
                             Storyboard.TargetProperty="RotationY"
                             By="360" Duration="0:0:15"
                             RepeatBehavior="Forever" />
                <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" 
                    Storyboard.TargetName="rectangle"
                    Duration="0:0:3.75" To="0.88"
                    RepeatBehavior="Forever" 
                    AutoReverse="True" >
                </DoubleAnimation>

            </Storyboard>


            <Rectangle x:Name="rectangle" 
                       Stroke="Blue" 
                       StrokeThickness="6" 
                       Fill="LightBlue" 
                       Opacity="0.5" 
                       RenderTransformOrigin="0.5,0.5">
                <Rectangle.RenderTransform>
                    <CompositeTransform/>
                </Rectangle.RenderTransform>
                <Rectangle.Projection>
                    <PlaneProjection x:Name="box" />
                </Rectangle.Projection>
            </Rectangle>