Silverlight和动画中的MVVM

时间:2011-09-01 17:45:22

标签: windows-phone-7 animation mvvm

鉴于我们有以下观点:

<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一无所知。

为这种图像插入设置动画的正确方法是什么?

2 个答案:

答案 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驱动的动画。

正是我所需要的。