在WPF中的代码中创建Storyboard

时间:2013-04-09 11:27:42

标签: c# .net wpf animation eventtrigger

以下代码正常运行。

<Window.Triggers>
    <EventTrigger RoutedEvent="Window.Loaded">
        <BeginStoryboard>
            <Storyboard>
                <DoubleAnimation Duration="0:0:.8" Storyboard.TargetProperty="Left" From="1920" To="0" AccelerationRatio=".1"/>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Window.Triggers>

但在此FromTo值中静态。我需要根据系统分辨率动态传递值。所以我需要在后面的代码中创建它。有可能吗?

如何将其转换为代码隐藏?

3 个答案:

答案 0 :(得分:38)

在代码中工作时,您不需要真正的Storyboard,只需要基本功能的动画,就像您在问题中显示的那样。 我做了一个小样本来展示它是多么容易。

这是主窗口背后的完整代码:

namespace WpfCSharpSandbox
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            WidenObject(150, TimeSpan.FromSeconds(1));
        }

        private void WidenObject(int newWidth, TimeSpan duration)
        {
            DoubleAnimation animation = new DoubleAnimation(newWidth, duration);
            rctMovingObject.BeginAnimation(Rectangle.WidthProperty, animation);
        }
    }
}

这就是XAML的样子:

<Window x:Class="WpfCSharpSandbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Sandbox" Height="350" Width="525">
    <Grid Background="#333333">
        <Rectangle x:Name="rctMovingObject" Fill="LimeGreen" Width="50" Height="50"/>
    </Grid>
</Window>

将它放在WPF应用程序中,看看它是如何工作的,试验它并尝试其他动画/属性。

答案 1 :(得分:3)

添加djerry的评论示例代码如下所示:

var anim = new DoubleAnimation {
                                From = 1920, 
                                To = 1, 
                               };

wnd.BeginAnimation(Window.LeftProperty, anim); 

你必须在窗口加载的事件处理程序中拥有此代码。希望这会有所帮助。

答案 2 :(得分:0)

该问题的示例代码与prop const&属性的动画有关,我正在寻找确切的情况,但给出的答案仅适用于一次性用例。
特别是:如果已经执行了动画,然后通过拖放手动移动了窗口,则相同的动画过程将无法再次正常运行。动画将始终使用最近运行的动画的结束坐标。
因此,如果您移动了窗口,它将在开始新动画之前跳回:

https://imgur.com/a/hxRCqm7

要解决该问题,需要在动画完成后从动画属性中删除任何Window.Left

通过使用AnimationClock作为第二个参数的ApplyAnimationClockBeginAnimation来完成:

null

XAML:

public partial class MainWindow : Window
{
    // [...]

    private void ButtonMove_Click(object sender, RoutedEventArgs e)
    {
        AnimateWindowLeft(500, TimeSpan.FromSeconds(1));
    }

    private void AnimateWindowLeft(double newLeft, TimeSpan duration)
    {
        DoubleAnimation animation = new DoubleAnimation(newLeft, duration);
        myWindow.Completed += AnimateLeft_Completed;
        myWindow.BeginAnimation(Window.LeftProperty, animation);
    }

    private void AnimateLeft_Completed(object sender, EventArgs e)
    {
        myWindow.BeginAnimation(Window.LeftProperty, null);
        // or
        // myWindow.ApplyAnimationClock(Window.LeftProperty, null);
    }
}

结果:
https://imgur.com/a/OZEsP6t

另请参见Remarks section of Microsoft Docs - HandoffBehavior Enum