0

我有一个动画问题,我不确定如何通过 Google 搜索或找到解决方案。我试图基本上创建一个包装选框。我通过在画布中包含以下内容来做到这一点:

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

动画从 B 部分的左侧在屏幕右侧开始,并在 B 部分的右侧碰到屏幕左侧时结束。A 部分和 C 部分是 B 部分的镜像,可产生“环绕”效果。当动画结束时,我将所有内容向右移动到 B 部分的确切宽度。对于用户来说,似乎什么都没发生......这一切都只是环绕。

问题是......选框中的某些项目可以隐藏,或者可以更改大小。因此,如果您隐藏一个项目,该项目将从所有三个部分中隐藏。由于东西被隐藏在 A 部分中,并且所有部分的大小都是动态的,因此整个选取框向左移动。

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

编辑:让我改述一下......因为这很令人困惑。

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

4

3 回答 3

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元素的 因此,如果您确实需要使用 a来包含视觉元素,那么我建议根据您上面的评论使用代替.HiddenStackPanelVisibility.CollapsedArrangeStackPanelVisibility.HiddenVisibility.Collapsed

还要注意VisualBrush复制选取框内容的使用。这将简化代码,并确保所有 3 种视觉效果始终匹配(您应用到包含 的Rectangle对象的任何定位或转换除外VisualBrush)。

此外,我应该说我个人会使用 aCanvas代替StackPanel,因为Canvas它更适合子元素的绝对定位,因此是您提出问题的原因。

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

于 2012-12-05T14:58:41.820 回答
1

要回答什么似乎是主要问题:

有没有办法使用 Canvas.Left 属性以外的东西来动画画布的位置

将 的RenderTransform属性设置Canvas为 aTranslateTransform并对属性进行动画处理TranslateTransform.X

<Canvas x:Name="myCanvas" RenderTransformOrigin="0.5,0.5">
    <Canvas.RenderTransform>
        <TranslateTransform X="0"/>
    </Canvas.RenderTransform>  
</Canvas>

然后在代码中:

编辑:此方法调用的第二个参数应该是 type DoubleAnimation,而不是Duration。当我打字的时候,我一定是在办公桌前睡觉。对不起。

(TranslateTransform)MyCanvas.RenderTransform.BeginAnimation(TranslateTransform.XProperty, new Duration(TimeSpan.FromSeconds(3)));

我希望这有帮助。

于 2012-12-04T19:53:30.603 回答
0

知道了。

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

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

于 2012-12-05T22:43:02.473 回答