如何在Silverlight 4 UserControl中动态动画属性?

时间:2010-11-17 18:52:31

标签: silverlight animation user-controls dynamic visualstatemanager

我在Silverlight 4 UserControl中遇到了令人费解的限制。

我想要实现的是拥有一个面板,当按下按钮时,该面板从最小化状态滑出,但是它的标题栏应该是可拖动的,可以调整此最大化状态的大小。

我为滑出做的是为这个面板的父Grid的MaxHeight属性设置动画,即使面板没有硬编码高度也能很好地工作,但我不知道怎样才能使这个动态

尝试将代码隐藏中的变量绑定到'DoubleAnimation'的'To'参数不起作用,它只是默默地被忽略。

当我创建UserControls来表示视图时,具有x:Name属性的元素将不会自动生成。

我尝试使用下面的代码来解决这个问题,该代码模仿了自动生成的代码中发生的事情(只有在实际加载布局后才会增加额外的好处):

public DoubleAnimation PanelOpenMaxHeightDoubleAnimation;

private void LayoutRoot_Loaded(object sender, System.Windows.RoutedEventArgs e)

{

    var LayoutRootreference = sender as Grid;

    PanelOpenMaxHeightDoubleAnimation = ((DoubleAnimation)(LayoutRootreference.FindName("PanelOpenMaxHeightDoubleAnimation")));

    PanelOpenMaxHeightDoubleAnimation.To = 383;

}

然而,当尝试设置To的值时,这会中断,因为FindName返回null(我将x:在XAML中为此特定动画手动设置的名称为“PanelOpenMaxHeightDoubleAnimation”)。我有偷偷摸摸的怀疑FindName无法从VisualStates中选择DoubleAnimations,只有实际布局的孩子?

我确实在http://msdn.microsoft.com/en-us/library/cc189026(v=VS.95).aspx#UserControls找到了关于XAML Namescopes的文档,但是我并没有真正理解我的选项是什么(除了非常有限):

  

对于UserControl的情况,定义XAML中的UserControl部分没有等效的模板部件属性约定,也没有应用模板。尽管如此,定义和用法之间的名称范围仍然是断开连接的,因为定义名称范围是定义的,然后在将UserControl打包到程序集中以便重用时有效密封。这里的最佳实践是定义UserControl,以便需要设置以修改XAML定义的任何值也作为UserControl的公共属性公开。

最后一句话是什么意思?

我想知道下一步可以吗?我应该尝试从代码生成整个状态吗?

1 个答案:

答案 0 :(得分:0)

好吧,设法解决了,所以我正在分享解决方案。

我没有尝试在参考资料中获得DoubleAnimation的引用,而是在我想要动画的布局中命名Grid,并使用原始问题中的代码获取对它的引用:

var SlidePanel = ((Grid)(LayoutRootreference.FindName("SlidePanel")));

这确实返回了元素并使用它可以从头开始创建DoubleAnimation和Storyboard纯粹在代码中。我刚刚使用此代码示例作为起点:http://msdn.microsoft.com/en-us/library/cc189069(VS.95).aspx#procedural_code

最好的部分是,你甚至可以在故事板中设置所有内容后更改DoubleAnimation.To参数,所以现在我正在做的只是在每次调用Storyboard.Begin()之前将其重置为我的计算值。 / p>

手动设置所有这些是有点繁琐,但至少它一旦你做得很好。