我想动画一个wpf窗口的宽度和高度。我尝试了下面的方法,不幸的是,它只动画了宽度...窗口的高度永远不会改变。
我肯定我错过了一些愚蠢的,并希望通过张贴在这里有人会看到我的错误!
下面是一个简单窗口的代码,其中有一个按钮,我已经连接到大小调整:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.AnimateWindowSize(ActualWidth + 200, ActualHeight + 200);
}
}
这里是我写的动画代码作为一个扩展方法,所以它可以应用于任何窗口...
public static class WindowUtilties
{
public static void AnimateWindowSize(this Window target, double newWidth, double newHeight)
{
var sb = new Storyboard {Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200))};
var aniWidth = new DoubleAnimationUsingKeyFrames();
var aniHeight = new DoubleAnimationUsingKeyFrames();
aniWidth.Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200));
aniHeight.Duration = new Duration(new TimeSpan(0, 0, 0, 0, 200));
aniHeight.KeyFrames.Add(new EasingDoubleKeyFrame(target.ActualHeight, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, 00))));
aniHeight.KeyFrames.Add(new EasingDoubleKeyFrame(newHeight, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, 200))));
aniWidth.KeyFrames.Add(new EasingDoubleKeyFrame(target.ActualWidth, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, 00))));
aniWidth.KeyFrames.Add(new EasingDoubleKeyFrame(newWidth, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, 200))));
Storyboard.SetTarget(aniWidth, target);
Storyboard.SetTargetProperty(aniWidth, new PropertyPath(Window.WidthProperty));
Storyboard.SetTarget(aniHeight, target);
Storyboard.SetTargetProperty(aniHeight, new PropertyPath(Window.HeightProperty));
sb.Children.Add(aniWidth);
sb.Children.Add(aniHeight);
sb.Begin();
}
}
提前感谢您的帮助。
3条答案
按热度按时间nzrxty8p1#
在Joe使用pinvoke和dependency属性的评论之后,我最终得到了这段代码。如果代码太长,我不应该把它都放在这里,我现在要道歉。在大小上的数学计算并不完美。WPF Actual(Height/Width)和Rect.Height/Width之间有很大的差异,可能需要一些计算才能得到你想要的确切大小。
已将其添加到MainWindow类中
在OP的代码中,我相应地更改了height和width目标属性
到
原答复:
从我所发现的没有问题,你的代码。当我改变了顺序,我添加动画到故事板(sb.Children.Add)示例,我得到了高度动画没有宽度。
这使我相信,当第一个动画正在发生时,另一个动画将无效。
我所能想到的是让他们一个接一个地动画,让一个动画比另一个稍长。更长的动画将在第一个动画完成后出现。
即使使用XAML故事板,我也无法同时调整窗口的高度和宽度。
cld4siwp2#
对我来说,新DP的一个建议似乎有点过头了,特别是因为解决方案承认它仍然不能同时调整大小。在我的快速实验中,添加一个延迟(通过Task.Run()),即使是1ms,也能达到最终的结果(窗口大小调整)。这个解决方案也不能同时调整大小,所以动画不像它可能的那样优雅,但它最终“工作”了。
mv1qrgav3#
我知道这是一个老线索,但我发现一个变通办法,似乎工作“可以接受”,至少在.net 7测试。代替动画窗口属性,设置大小的内容和定义窗口大小使用
SizeToContent="WidthAndHeight"
。然后动画网格大小。它不是平滑的肯定(每一帧都会导致一次重画,因为这就是windows的工作原理,我怀疑任何解决方案都无法解决这个问题),但至少它的宽度/高度是平行的。