【问题标题】:How can I animate a property dynamically in a Silverlight 4 UserControl?如何在 Silverlight 4 UserControl 中动态地为属性设置动画?
【发布时间】:2011-05-11 14:47:39
【问题描述】:

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

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

我为滑出所做的是为此面板的父网格的 MaxHeight 属性设置动画,即使面板没有硬编码的高度,它也能很好地工作,但我不知道如何才能使这个动态.

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

当我创建用户控件来表示视图时,具有 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(我在 XAML 中手动将此特定动画的 x:Name 设置为“PanelOpenMaxHeightDoubleAnimation”)。我偷偷怀疑 FindName 不能从 VisualStates 中选择 DoubleAnimations,只有实际的布局子项?

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

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

最后一句是什么意思?

想知道接下来我可以做什么?我应该尝试从代码生成整个状态吗?

【问题讨论】:

    标签: silverlight animation user-controls dynamic visualstatemanager


    【解决方案1】:

    嗯,已经解决了,所以我正在分享解决方案。

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

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

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

    最好的部分是,即使在 Storyboard 中设置了所有内容之后,您也可以更改 DoubleAnimation.To 参数,所以现在我所做的只是在每次调用 Storyboard.Begin() 之前将其重置为我的计算值。

    手动设置所有这些有点繁琐,但至少一旦你设置它就可以很好地工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      相关资源
      最近更新 更多