我有一个ItemsControl,其中包含许多元素,每个元素都有自己的ViewModel实例。每个项目的ViewModel都知道该项目是否应该可见(当前每个ViewModel都有一个UI绑定到的Visibility属性)。当我的窗口首次打开时,其中一些项目可见,其他项目已折叠。之后,某些项目的可见性可能会随用户交互而变化。窗口大小为其内容,因此窗口会在显示或隐藏项目时调整大小。窗口最初以屏幕为中心(这意味着一切都必须立即正确排列,因此窗口知道它的初始尺寸并且可以相应地居中)。
现在我想在显示或隐藏项目时添加动画 - 但我只想在窗口已经显示后项目的可见性发生变化。因此,如果窗口已经打开,并且用户做了一些使ViewModel想要出现的东西,那么它就会动画出来;如果用户做某事使其中一个ViewModels消失,它会动画出来。但是当窗口第一次打开时,我希望一切都开始坚如磐石 - 没有挥之不去的动画。
我希望窗口仍然根据其最初可见的内容设置其初始大小,我仍然希望它最初在屏幕上居中。 (虽然实际上,在这种情况下,如果它自身居中,好像所有项目都是可见的,如果事件排序使其以这种方式运行,那将是可以接受的。)
我对WPF有一点了解,但我承认在涉及触发器和故事板时我已经迷失了。我之前没有对WPF动画做过任何事情,我不知道从哪里开始。
我已经尝试过使用Bag of Tricks中的Reveal,但我遇到了一些问题,最大的问题是它没有“仅在窗口后使用动画 “我想要的行为 - 我的窗口会出现,最初可见的元素仍然会动画。它也不适合我的布局(它将元素水平居中,而不是将它们拉伸到ItemsControl的宽度) ,以及其他一些可能或可能无法解决的问题。
我对于是否通过拉伸进行动画制作并不太挑剔(例如,通过将SizeX = 1 SizeY = 0的LayoutTransform设置为SizeX = 1 SizeY = 1,从而以压扁文本开始并扩展到正常大小)或者仅通过改变高度(因此只有部分内容可见,并随着动画的进展而显露更多) - 我也很好。
我愿意写自己的Panel后代(之前我已经完成过),如果这是解决这个问题的最佳方法,我总是可以从Reveal中窃取代码并破解,直到我开始工作 - 但似乎就像我应该已经有一个更简单的方法来做到这一点,如果我只是知道它是什么。如果有人能指出我正确的方向,我愿意学习触发器和故事板等等。