从左侧以外的点进行动画制作

时间:2012-12-04 18:07:51

标签: wpf animation

我遇到动画问题,我不确定如何使用Google或找到解决方案。我正在尝试基本上创建一个包装Marquee。我通过在画布中包含以下内容来实现此目的:

| --- A部分--- | --- B部分--- | C部分--- |

动画从屏幕右侧B部分的左侧开始,当B部分的右侧碰到屏幕左侧时结束。 A部分和C部分是B部分的镜像,它创造了“环绕”效果。当动画结束时,我将所有内容向右移动到B部分的确切宽度。对于用户来说,似乎没有任何事情发生过......它只是环绕着。

问题是这个...选框中的一些项目可以隐藏,或者可以改变大小。因此,如果您隐藏项目,则该项目将在所有三个部分中隐藏。由于事物被隐藏在A部分中,并且所有部分都是动态调整大小的,因此整个选框移动到左侧。

有没有办法将动画“锚定”在一个地方,比如说,在B部分的中间,这样当项目隐藏在A部分时,它不会将B和C部分滑过?相反,我希望A部分向右移动以填补空间。

编辑:让我重新说一下......因为这令人困惑。

我有一个画布,其中包含一个stackpanel,其中包含三个堆栈面板。这三个堆栈面板实际上是相同信息的副本,这给出了当我制作动画时包裹的选框的错觉。在选取框中添加/删除项目时,堆栈面板中的这些项目会更改,这会调整堆栈面板的整体大小,从而调整画布的大小。我想知道的是,我是否可以“锚定”堆栈面板内的特定位置。我可以“锚定”第二个堆栈面板副本中的第一个项目吗?

3 个答案:

答案 0 :(得分:1)

回答APPEARS的主要问题:

  

有没有办法使用某些东西动画画布的位置   除了Canvas.Left属性

RenderTransform的{​​{1}}属性设置为Canvas并为TranslateTransform属性设置动画:

TranslateTransform.X

然后在代码中:

编辑:此方法调用的第二个参数应为<Canvas x:Name="myCanvas" RenderTransformOrigin="0.5,0.5"> <Canvas.RenderTransform> <TranslateTransform X="0"/> </Canvas.RenderTransform> </Canvas> 类型,而不是DoubleAnimation。我打字时一定是在我的桌子上睡觉。遗憾。

Duration

我希望这会有所帮助。

答案 1 :(得分:1)

当你详细说明你想要的行为时,我的另一个答案已经过时了,所以请原谅我发布一秒钟。根据我对上述答案的后评,请考虑以下示例:

<Canvas x:Name="LayoutRoot">

    <Grid x:Name="MarqueePanels">

        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <Rectangle Grid.Column="0" Height="{Binding ElementName=PrimaryMarquee, Path=ActualHeight}" Width="{Binding ElementName=PrimaryMarquee, Path=ActualWidth}">
            <Rectangle.Fill>
                <VisualBrush Visual="{Binding ElementName=PrimaryMarquee}"/>
            </Rectangle.Fill>
        </Rectangle>

        <StackPanel Grid.Column="1" x:Name="PrimaryMarquee">
            <TextBlock Text="Marquee Item 1"/>
            <TextBlock Text="Marquee Item 2"/>
            <TextBlock Text="Marquee Item 3"/>
        </StackPanel>

        <Rectangle Grid.Column="2" Height="{Binding ElementName=PrimaryMarquee, Path=ActualHeight}" Width="{Binding ElementName=PrimaryMarquee, Path=ActualWidth}">
            <Rectangle.Fill>
                <VisualBrush Visual="{Binding ElementName=PrimaryMarquee}"/>
            </Rectangle.Fill>
        </Rectangle>

    </Grid>

</Canvas>

正如我上面提到的,将Visibility个元素的TextBox设置为Hidden不会导致StackPanel父级调整大小,但是使用{{1}将强制父面板的Visibility.Collapsed传递。因此,如果您确实需要使用Arrange来包含视觉元素,那么我建议您根据上面的评论使用StackPanel代替Visibility.Hidden

另请注意使用Visibility.Collapsed复制Marquee内容。这将简化代码,并确保所有3个视觉效果始终匹配(除了您应用于容纳VisualBrush的{​​{1}}对象的任何定位或转换之外。

另外,我应该说我个人会使用Rectangle代替VisualBrush,因为Canvas更适合儿童元素的绝对定位,因此原因对于你的问题。

克雷格,我真的希望这会有所帮助。我(就像这里的大多数人一样)会尽力帮助我。祝你好运!

答案 2 :(得分:0)

知道了。

我将边距设置为 - (theControl.ActualWidth / 2)。我的所有代码都将相同数量的所有内容都移回去补偿。

然后我在控件上有一个SizeChanged的事件处理程序,我设置了这个值。如果控件的大小发生变化,则边距会更新,并且所有内容都会集中在控件的中间。如果控件中有一个特定点,您想要将动画居中,那么请使用该点而不是上述的中点。