以下代码正常运行。
<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>
但在此From
和To
值中静态。我需要根据系统分辨率动态传递值。所以我需要在后面的代码中创建它。有可能吗?
如何将其转换为代码隐藏?
答案 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&
属性的动画有关,我正在寻找确切的情况,但给出的答案仅适用于一次性用例。
特别是:如果已经执行了动画,然后通过拖放手动移动了窗口,则相同的动画过程将无法再次正常运行。动画将始终使用最近运行的动画的结束坐标。
因此,如果您移动了窗口,它将在开始新动画之前跳回:
要解决该问题,需要在动画完成后从动画属性中删除任何Window.Left
。
通过使用AnimationClock
作为第二个参数的ApplyAnimationClock
或BeginAnimation
来完成:
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