【发布时间】:2011-11-15 09:53:01
【问题描述】:
是否可以为 AttachedPropertys 创建一个 c# 动画,例如对齐?从 HorizontalAlignment.Left 到 HorizontalAlignment.Right 的变化可能需要 1 秒 - 有可能吗?
非常感谢。
【问题讨论】:
标签: c# wpf animation alignment
是否可以为 AttachedPropertys 创建一个 c# 动画,例如对齐?从 HorizontalAlignment.Left 到 HorizontalAlignment.Right 的变化可能需要 1 秒 - 有可能吗?
非常感谢。
【问题讨论】:
标签: c# wpf animation alignment
您无法在制作平滑动画的意义上对其进行动画处理,因为它们是离散状态,因此某些东西从左向右滑动。没有任何中间值。可以创建一个“动画”,在某个点从左到右改变对齐方式,它只是不会滑过。您还可以做大量工作并测量所有控件以手动创建动画,该动画使用 Canvas.Left 或边距之类的东西从屏幕的一侧移动到另一侧来定位控件。
附加属性部分不是问题,只需在动画的目标属性部分中使用附加属性的全名即可。
【讨论】:
虽然不可能直接在两个属性之间平滑动画,例如
HorizontalAlignment="Right" VerticalAlignment="Bottom"
到
HorizontalAlignment="Center" VerticalAlignment="Center"
我确实想出了一种方法,以一种我认为值得分享的方式为应用程序执行此操作。我只是将控件放在占据整个窗口窗格的网格中。我将控件对齐到网格的右下角。然后我对网格进行了动画处理,以变换和缩小我需要的角到我想要对齐控件的点(在本例中为中心。请参阅下面的完整代码。
<Grid Margin="5,5,14,70" Visibility="{Binding Path=AdminModeIsEnabled, Converter={StaticResource CollapsedVisibilityConverter}, FallbackValue=Visible}">
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="LayoutTransform">
<Setter.Value>
<ScaleTransform/>
</Setter.Value>
</Setter>
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform/>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding CenterPanel}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)" To="2" Duration="0:0:0.5" />
<DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To=".5" Duration="0:0:0.5" />
<DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleX)" To="2" Duration="0:0:0.5" />
<DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleX)" To=".5" Duration="0:0:0.5" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.5" />
<DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.5" />
<DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.5" />
<DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.5" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Image Height="15" Source="\Images\Test.png" HorizontalAlignment="Right" VerticalAlignment="Bottom" />
</Grid>
【讨论】:
有可能,这里有一个例子:
class StoryBoardManager : System.Windows.Media.Animation.Storyboard
{
public void ChangeRectangleAlignment(DependencyObject target, VerticalAlignment verticalAlignment, HorizontalAlignment horizontalAlignment, int BeginTimeMillisecond)
{
ObjectAnimationUsingKeyFrames objectAnimation = new ObjectAnimationUsingKeyFrames()
{
BeginTime = TimeSpan.FromMilliseconds(0)
};
Storyboard.SetTarget(objectAnimation, target);
Storyboard.SetTargetProperty(objectAnimation, new PropertyPath("(FrameworkElement.HorizontalAlignment)"));
DiscreteObjectKeyFrame keyFrame = new DiscreteObjectKeyFrame(horizontalAlignment, TimeSpan.FromMilliseconds(BeginTimeMillisecond));
objectAnimation.KeyFrames.Add(keyFrame);
this.Children.Add(objectAnimation);
}
}
有关详细信息,请参阅this other question。
【讨论】: