鉴于我们有以下观点:
<StackPanel>
<TextBlock Text="Some text"/>
<Image Source="{Binding vmImageProp}" Height="10" Visibility="{Binding vmImageVisProp}" />
<StackPanel/>
在启动时,当ViewModel初始化并绑定到View时,vmImageVisProp
设置为Collapsed。这是正确的,我不需要为隐藏的图像预留空间。
在应用程序执行的某个时刻,逻辑告诉VM使Image可见。如果我只是将vmImageVisProp
属性设置为Visible
,我的StackPanel将暂时重新调整大小,从而产生不希望的跳跃效果。
但是我想为StackPanel的平滑重新设置动画,然后,当空白空间准备好后,图像将显示在那里。
我知道如何为此制作一系列动画。
我不知道的是,如何解决StackPanel的未知最终大小。我需要知道它,以告诉动画StackPanels的高度应该有多大。
我知道堆栈面板的高度应该增加10(出现的图像的高度),但是当我定义动画时,我需要在stackPanel上显式设置结果高度。
由于我要从ViewModel代码执行动画,我可以动态计算它,但我不知道如何获得StackPanel的高度,因为viewModel一无所知。
为这种图像插入设置动画的正确方法是什么?
答案 0 :(得分:0)
使用WPF和Silverlight(对于Web),有一个隐藏元素的Visibility.Hidden值,但保留了它所需的空间。但是,我认为这在Silverlight for Windows Phone 7中不可用。
作为替代方案,如何将图像的Opacity
设置为零,然后将其设置为1以显示它?使用零不透明度,您可以使用图像高度/宽度来执行动画。
答案 1 :(得分:0)
如果有人需要解决方案以供将来参考:
我找到了这篇博客文章: http://dotnetbyexample.blogspot.com/2011/01/viewmodel-driven-animations-using.html
它展示了如何使用Visual State Manager中的功能使用ViewModel驱动的动画。
正是我所需要的。