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