Wpf 从左侧以外的点设置动画

Wpf 从左侧以外的点设置动画,wpf,animation,Wpf,Animation,我有一个动画问题,我不知道如何谷歌或找到一个解决方案。我试图基本上创建一个包装框。我通过在画布中放置以下内容来实现这一点: |---A节-----B节-----C节---| 动画从屏幕右侧B部分的左侧开始,在B部分的右侧撞击屏幕左侧时结束。A和C部分是B部分的镜像,产生了“环绕”效果。当动画结束时,我将所有内容向右移动到B部分的确切宽度。对于用户来说,似乎什么都没有发生。。这一切都只是包装而已 问题是。。。字幕中的某些项目可以隐藏,也可以更改大小。因此,如果隐藏某个项目,则该项目将从所有三个部分

我有一个动画问题,我不知道如何谷歌或找到一个解决方案。我试图基本上创建一个包装框。我通过在画布中放置以下内容来实现这一点:

|---A节-----B节-----C节---|

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

问题是。。。字幕中的某些项目可以隐藏,也可以更改大小。因此,如果隐藏某个项目,则该项目将从所有三个部分中隐藏。由于内容隐藏在部分A中,并且所有部分的大小都是动态调整的,所以整个字幕移到左侧

有没有办法在一个点“锚”动画,比如在B段中间,这样当项目被隐藏在A部分时,它不会滑动B段和C段吗?相反,我希望A部分向右移动以填充空间

编辑:让我重新措辞。。。因为这让人困惑


我有一个画布,其中包含一个stackpanel,它还包含三个堆栈面板。这三个堆栈面板实际上是相同信息的副本,这使我在设置动画时产生了一个环绕的字幕的错觉。在选框中添加/删除项目时,堆栈面板中的项目将更改,从而调整堆栈面板的总体大小,从而调整画布的大小。我想知道的是,我是否可以在stackpanel中“锚定”一个特定的位置。我可以在第二个stackpanel副本的第一个项目上“锚定”吗

要回答看似主要的问题:

有没有一种方法可以使用一些东西来设置画布位置的动画 除了Canvas.Left属性之外

Canvas
RenderTransform
属性设置为
TranslateTransform
并设置
TranslateTransform.X
属性的动画:

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

我希望这能有所帮助。

我的另一个答案在你详细阐述你想要的行为时已经过时了,所以请原谅我再发一次帖子。根据我对以上答案的评论,请考虑下面的例子:

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

如上所述,将任何
文本框
元素的
可见性
设置为
隐藏
不会导致
堆栈面板
父面板调整大小,但是使用
可见性。折叠的
将强制父面板通过
排列
。因此,如果您确实需要使用
StackPanel
来包含可视元素,那么根据您的上述评论,我建议使用
Visibility.Hidden
代替
Visibility.Collapsed

还要注意使用
VisualBrush
复制字幕内容。这将简化代码,并确保所有3种视觉效果始终匹配(除了应用于容纳
VisualBrush
矩形对象的任何定位或变换)

此外,我应该说,我个人会使用
画布
来代替
堆栈面板
,因为
画布
更适合子元素的绝对定位,这就是您提出问题的原因

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

明白了

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


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

是的。真不敢相信我在没有学习RenderTransferMorigin的情况下走了这么远。有没有一种方法可以锚定控件中的某个特定点,而不是某个百分比?例如,如果我想锚定在一个可能移动的特定控件上,因为它周围的控件可以更改大小。我希望这样,当字幕改变大小时,屏幕上的任何东西都会留在屏幕上,而不是向左或向右移动。这有意义吗?你能分享你的标记吗<代码>画布
在添加或删除其他项目时,子项不应四处移动。您必须有另一个布局面板处理
画布中的位置
,才能体验您所描述的内容。请张贴一些标记,以便我们继续提供帮助。谢谢。我本来可以解释得更清楚的。我有一个画布,其中包含一个stackpanel,它还包含三个堆栈面板。这三个堆栈面板实际上是相同信息的副本,这使我在设置动画时产生了一个环绕的字幕的错觉。在选框中添加/删除项目时,堆栈面板中的项目将更改,从而调整堆栈面板的总体大小,从而调整画布的大小。我想知道的是,我是否可以在stackpanel中“锚定”一个特定的位置。我可以在第二个stackpanel副本的第一个项目上“锚定”吗?另外,我尝试设置RenderTransferMorigin。当选框重新调整尺寸时,它仍然不会从中间调整尺寸。每样东西都是相对于左边移动的。我还是不太确定你在问什么,但让我来告诉你
<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>