2011-07-26 81 views
1

如何限制平面投影到特定尺寸?例如,我有以下几点:平面投影的约束尺寸

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

我想通过360度绕Y轴旋转这一点,但永远不希望投射到超出矩形的高度的范围 - 在这种情况下,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> 
+0

@HiTech魔术师:好吧,我不确定我明白你的意思。我已经更新了上面的代码,以绿色显示上部和下部Bounderies。投影不应超出或低于绿线。 –

+0

是的,当我意识到你的意思时做了类似的事情。测试答案如下。 –

回答

0

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

它基本上在总时间的四分之一范围内将Y缩放到0.88(并且是AutoReversed)。

可以简化元素命名为您做了与“盒子”,如果你喜欢(我用的混合,以作者/测试的故事板,它总是产生长期的元素名称):

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

谢谢。我希望有某种内置的方式可以使这更容易。我会等待看看是否有其他答案进来。 –

+0

@Otaku:行为(超越界限)在设计上是因为所有透视变换在Z平面上大约为0。另一种方法是使用不同的Z原点对矩阵变换进行动画处理。 –